簡體   English   中英

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

[英]Java Generic Collection of Generic Type with Bounded Wildcard

請在這件事上給予我幫助:

如果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>在聲明的范圍內,但不在定義范圍內,所以這會崩潰。

當使用非通配符泛型類型T分配給變量( Set<T> )時,所分配的對象必須具有完全T作為其泛型類型(包括T所有泛型類型參數,通配符和非通配符)。 在你的情況下, TCage<Lion> ,它與Cage<? extends Animal>類型不同Cage<? extends Animal> Cage<? extends Animal>

你可以做什么,因為Cage<Lion>可以分配給Cage<? extends Animal> 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM