请在这件事上给予我帮助:
如果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));