簡體   English   中英

在Java中將通配符與嵌套泛型一起使用

[英]Using wildcards with nested generics in java

我有一個可以同時使用通用NumberDouble來執行特定計算的列表的類。

這工作正常:

public class Test<T extends Number> {

    public void testGeneric(List<T> list){
        doTest(list);
    }

    public void testExplicit(List<Double> list){
        doTest(list);
    }

    public void doTest(List<? extends Number> testList){}

}

但是,如果所討論的參數是嵌套類型,則它將不再編譯:

public class Test<T extends Number> {

    public void testGeneric(List<List<T>> list){
        doTest(list);
    }

    public void testExplicit(List<List<Double>> list){
        doTest(list);
    }

    public void doTest(List<List<? extends Number>> testList){}

}

請注意,列表的功能並不重要,第二個List類型可以是任何通用類型,例如T類型的包裝器。 我真的不明白為什么應該有任何區別。 有沒有解決的辦法?

謝謝!

正如您顯然已經意識到的那樣, List<Double>不是List<Number>的子類型; 您需要使用通配符將繼承“傳播”為通用類型: List<Double>List<? extends Number>的子類型List<? extends Number> List<? extends Number> 但是,通配符必須始終從最外層開始: List<X>List<List<? extends Number>>的子類型List<List<? extends Number>> 僅當X 恰好List<? extends Number>時才List<List<? extends Number>> List<? extends Number> List<? extends Number> 是否要接受List<? extends Number>其他子類型List<? extends Number> List<? extends Number> ,例如List<Double> ,需要List<? extends List<? extends Number>> List<? extends List<? extends Number>> List<? extends List<? extends Number>>

暫無
暫無

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

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