[英]Generics cast issue
這是我的問題:給出這些課程
class A {}
class B extends A {}
此代碼編譯:
List<Class<? extends A>> list = Arrays.asList(B.class, A.class);
而這不是:
List<Class<? extends A>> anotherList = Arrays.asList(B.class);
是什么賦予了?
更新:此代碼在Java 8中編譯。顯然,由於“改進的類型推斷”。
在第一個例子中, Arrays.asList()
調用的推斷類型是List<Class<? extends A>>
List<Class<? extends A>>
,顯然可以賦予相同類型的變量。
在第二個示例中,右側的類型是List<Class<B>>
。 而Class<B>
是分配給Class<? extends A>
Class<? extends A>
, List<Class<B>>
不能分配給List<Class<? extends A>>
List<Class<? extends A>>
。 它可以分配給List<? extends Class<? extends A>>
List<? extends Class<? extends A>>
List<? extends Class<? extends A>>
。
其原因與List<B>
不能分配給List<A>
的原因相同。 如果是,它將使以下(非類型安全)代碼成為可能:
List<Class<B>> bb = new ArrayList<B>();
List<Class<? extends A>> aa = bb;
aa.add(A.class);
這將編譯:
List<Class<? extends A>> numbers = Arrays.<Class<? extends A>>asList(B.class);
Arrays.asList(B.class);
被廣泛認為是
List<Class<B>> numbers = Arrays.asList(B.class);
因為它只有一個類型為T
屬性與參數化類型匹配(在本例中為B.class
)。
該死的好問題,我不知道答案,但這是一個解決方法:
List<Class<? extends A>> numbers = new ArrayList<Class<? extends A>>(Arrays.asList(B.class));
只是添加,我們可以重寫代碼如下
List<Class<? extends A>> asListA = Arrays.asList(B.class, A.class);
List<Class<B>> asListB = Arrays.asList(B.class);
List<Class<? extends A>> numbers = asListA;
List<Class<? extends A>> numbers2 = asListB; // it will fail here
@Inerdia已經解釋了細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.