具有有界通配符的通用类型的Java通用集合

时间:2010-05-20 18:11:31

标签: java generics collections bounded-wildcard

请帮助我:

如果Lion IS-A Animal并且给定Cage<T>

Cage<? extends Animal> c = new Cage<Lion>(); // ok,

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); // not ok

我在这里看不到什么?

3 个答案:

答案 0 :(得分:6)

这是错误的,因为如果允许,那么这将是合法的:

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal>

Cage<Tiger>在声明的范围内,但不在定义范围内,所以这会崩溃。

答案 1 :(得分:6)

使用非通配符泛型类型Set<T>分配变量(T)时,所分配的对象必须具有与其通用类型完全相同的T(包括所有泛型类型参数) T,通配符和非通配符)。在您的情况下,TCage<Lion>,与Cage<? extends Animal>的类型不同。

您可以执行的操作,因为Cage<Lion>可分配给Cage<? extends Animal>,使用通配符类型:

Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>();

答案 2 :(得分:2)

你需要:

Set<? extends List<? extends Number>> cc = new HashSet<ArrayList<Integer>>();

解释原因......我想回到你的例子的简单版本:

Number a = new Integer(1); // OK
Set<Number> b = new HashSet<Integer>(); // not OK

这不起作用,因为它允许

b.add(new Double(3.0));