簡體   English   中英

泛型投射問題

[英]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已經解釋了細節。

這是泛型中的協方差/逆變量問題。 以下SO問題應該有助於您理解和解決問題:

在Java中展示協方差和逆變?

如何在Java泛型中使用逆變?

暫無
暫無

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

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