簡體   English   中英

如何將列表從子類泛型轉換為父類泛型?

[英]How do I cast a List from a subclass generic to a parent class generic?

我正在修改開放式JDK以添加功能,但是我遇到了兩次都沒有好的解決方案。

有一個名為JCStatement的類,它擴展了JCTree

問題:我想將List<JCStatement>轉換為List<JCTree>

顯然,一個類可以引用其擴展名之一,但是當我將其放在List上時,它只是不起作用。

我曾經使用過: (List<JCTree>)((List<?>)params)進行(List<JCTree>)((List<?>)params) ,但不能在ant上構建。 IDE給我以下警告:

Type safety: Unchecked cast from List<capture#1-of ?> to List<JCTree>

因此,這必須以某種方式解決。

感謝您的幫助。

您無法進行此演員表轉換。

如果將List<JCStatement>轉換為List<JCTree> ,然后將JCTree(非JCStatement)對象添加到該列表,會發生什么情況? 它破壞了List<JCStatement>類型的安全性。

如果您知道不會將任何元素添加到列表中-這樣它將是類型安全的-然后Collections.unmodifiableList(List<? extends E>)將返回List<E>

這完全是類型安全和合法的,因為它強制保證您絕不會將非法元素添加到列表中,並且由JDK提供。

這樣的事情對您有用嗎?

import java.util.ArrayList;
import java.util.List;

class A {
}

class B extends A {
}

class C extends A {
}

public class Program {
    public static void foo(List<? extends A> list) {
    }

    public static void main(String[] args) {
        List<A> listA = new ArrayList<A>();
        List<B> listB = new ArrayList<B>();
        List<C> listC = new ArrayList<C>();
        List<? extends A> listX = (List<? extends A>) listB;
        List<? extends A> listY = (List<? extends A>) listC;

        foo(listA);
        foo(listB);
        foo(listC);
        foo(listX);
        foo(listY);
    }
}

這似乎是List或一般類型的通用類型集合的問題。

最簡單的解決方案:

ListBuffer<JCTree> ls = new ListBuffer<JCTree>();
for(JCVariableDecl v : params){ ls.append(v); }
return ls.toList();

如果您真的很確定通過使用Raw Type進行轉換,則可以這樣做

List<Number> listA = new LinkedList<Number>();
List<Integer> listB = new LinkedList<Integer>();
listA = (List<Number>)(List) listB;

我無法想象自己曾經認為這是解決問題的好方法,但是它將滿足您的要求,並且在編譯時間泛型時有一些令人煩惱的限制:)

對於不安全的演員表,總會有警告,因為您所做的實際上是不安全的。 編譯器無法使其變得安全,您必須自己確保這一點。

暫無
暫無

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

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