请在这件事上给予我帮助:
如果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
我在这里看不到什么?
请在这件事上给予我帮助:
如果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
我在这里看不到什么?
这是错误的,因为如果它被允许,那么这将是合法的:
Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>();
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal>
Cage<Tiger>
在声明的范围内,但不在定义的范围内,所以这会崩溃。
当分配给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>>();
你需要:
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));