What is the difference between List and List<? extends Number>?

后端 未结 3 2136
野的像风
野的像风 2020-12-03 15:28

I have a very basic question ragarding Java generics . I thought that both List and List are

相关标签:
3条回答
  • 2020-12-03 15:57

    Generic types are more pedantic.

    <? extends Number> means Number or an unknown a sub class. If you obtain such a value it will be a Number, but you cannot give a value of this type because you don't know which is valid.

    The difference is in arguments and return values.

    List<Number> numbers = new ArrayList<Number>();
    Number n = 1;
    numbers.add(n); // ok.
    n = numbers.get(0); // ok
    numbers.add(1); // ok.
    
    List<? extends Number> numbers2 = new ArrayList<Double>();
    numbers2.add(n); // not ok
    n = numbers2.get(0); // ok
    
    List<? super Number> numbers3 = new ArrayList<Serializable>();
    numbers3.add(n); // ok
    n = numbers3.get(0); // not ok.
    

    super is used in a few places to signify the type can be a super type. e.g.

    In Collections, this method says the Comparator needs to be able to compare the same type or any super type.

    public static <T> void sort(List<T> list, Comparator<? super T> c)
    

    This means you can have

    Comparator<Number> comparesAnyNumbers = ...
    List<Integer> ints = ...
    Collections.sort(ints, comparesAnyNumbers);
    
    0 讨论(0)
  • 2020-12-03 15:59

    Generics are compile time language features, means, they don't exist in run-time. In generic mechanism, for compile-time checks, they are not homogeneous, i.e. if you want to use polymorphism in generic type.

    Following gives you a compile time error, although it seems a valid definition:

     List<Number> list = new ArrayList <Integer>();
    

    whereas

     List<? extends Number> list = new ArrayList <Integer>();
    

    is valid. Moreover, you can't use wildcard types on the right side:

     List list = new ArrayList <? extends Integer>();
    

    won't be compiled.

    0 讨论(0)
  • 2020-12-03 16:10

    List<Number> --> List of Numbers (or instances of Number)

    List<? extends Number> --> List any type which extends Number

    0 讨论(0)
提交回复
热议问题