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

ar_*_*ar_ 7 java generics collections bounded-wildcard

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

如果Lion IS-A Animal给定Cage<T>:

Cage<? extends Animal> c = new Cage<Lion>(); // ok,
Run Code Online (Sandbox Code Playgroud)

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); // not ok
Run Code Online (Sandbox Code Playgroud)

我在这里看不到什么?

Mic*_*ers 6

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

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal>
Run Code Online (Sandbox Code Playgroud)

Cage<Tiger> 是在声明的范围内,但不是定义,所以这会崩溃.


ILM*_*tan 6

Set<T>使用非通配符泛型类型分配给variable()时T,所分配的对象必须T与其泛型类型完全相同(包括T通配符和非通配符的所有泛型类型参数).你的情况TCage<Lion>,这是不一样的类型Cage<? extends Animal>.

你能做什么,因为Cage<Lion>可以分配Cage<? extends Animal>,是使用通配符类型:

Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>();
Run Code Online (Sandbox Code Playgroud)