我有一个关于Java 泛型的非常基本的问题。我以为两者List<Number>
都是List<? extends Number>
同质的。我是对的还是我缺少一些基本的东西?
问问题
5483 次
3 回答
6
泛型类型更加迂腐。
<? extends Number>
表示数字或未知的子类。如果您获得这样的值,它将是 a Number
,但您不能给出这种类型的值,因为您不知道哪个是有效的。
区别在于参数和返回值。
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
在一些地方使用来表示该类型可以是超类型。例如
在 Collections 中,此方法表示 Comparator 需要能够比较相同类型或任何超类型。
public static <T> void sort(List<T> list, Comparator<? super T> c)
这意味着您可以拥有
Comparator<Number> comparesAnyNumbers = ...
List<Integer> ints = ...
Collections.sort(ints, comparesAnyNumbers);
于 2012-08-31T13:29:49.210 回答
3
泛型是编译时语言特性,意味着它们不存在于运行时。在泛型机制中,对于编译时检查,它们不是同质的,即如果您想在泛型类型中使用多态性。
以下为您提供编译时错误,尽管它似乎是一个有效的定义:
List<Number> list = new ArrayList <Integer>();
然而
List<? extends Number> list = new ArrayList <Integer>();
已验证。此外,您不能在右侧使用通配符类型:
List list = new ArrayList <? extends Integer>();
不会被编译。
于 2012-08-31T13:33:45.710 回答
1
List<Number>
--> Number
s 列表(或 s 的实例Number
)
List<? extends Number>
--> 列出任何扩展的类型Number
于 2012-08-31T13:35:07.437 回答