请帮助我:
如果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
我在这里看不到什么?
答案 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
,通配符和非通配符)。在您的情况下,T
为Cage<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));