7

请在这件事上给予我帮助:

如果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

我在这里看不到什么?

4

3 回答 3

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>在声明的范围内,但不在定义的范围内,所以这会崩溃。

于 2010-05-20T18:15:18.883 回答
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>>();
于 2010-05-20T18:33:33.850 回答
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));
于 2010-05-20T18:20:43.263 回答