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

具有有界通配符的泛型类型的Java泛型集合,java,generics,collections,bounded-wildcard,Java,Generics,Collections,Bounded Wildcard,请帮我做这个: 如果狮子是一种动物并且被关在笼子里: Cage这是错误的,因为如果允许,那么这是合法的: Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal> 设置您需要: Set<

请帮我做这个:

如果
狮子是一种动物
并且被关在
笼子里


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

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal>
设置您需要:

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

当使用非通配符泛型类型
T
分配给变量(
Set
)时,被分配的对象必须将
T
作为其泛型类型(包括
T
的所有泛型类型参数、通配符和非通配符)。在您的例子中,
T
Cage
,它与
Cage的类型不同。Java如何决定是否应用反方差/协方差?我的理解是,Java将泛型视为不变量(但奇怪的是,在运行时将数组视为协方差和类型检查),而是通过使用合适的通配符编写方法(适当时扩展或超级)参数,以及一些强制转换和抑制未经检查的转换,您可以给人以适合您的情况的印象。感谢您,对我来说,这是缺少的部分。
Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal>
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));
Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>();