[英]Using wildcards with nested generics in java
我有一個可以同時使用通用Number
和Double
來執行特定計算的列表的類。
這工作正常:
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.