[英]Nested wildcards with lower bounds
因此,我閱讀了主要的Java泛型常見問題解答,而使我受阻的唯一問題是具有較低界限的嵌套通配符。 我想舉一個例子,說明我的理解,明確的工作方式以及我的看法。 也許您可以告訴我,我認為這是錯誤的方式,即使編譯器在“好”情況下也沒有抱怨。
示例1(有意義):
static void WildcardsMethod(List<? extends Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
我首先看一下最深的通配符,並將其綁定在WildcardMethod的簽名中。 它正在尋找Pair<? extends Number>
Pair<? extends Number>
。 因此,我可以使用Pair<Integer>
, Pair<Double>
等。 現在,如果我決定將Pair<Integer>
替換為Pair<? extends Number>
,我的腦海中就會出現以下代碼Pair<? extends Number>
Pair<? extends Number>
:
List<? extends Pair<Integer>>
現在,通配符表示參數化類型Pair<Integer>
的類型/子類型。 因此,我可以將Pair<Integer>
或SubPair<Integer>
傳遞給WildcardsMethod。
示例2(有意義):
static void WildcardsMethod(List<? extends Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Number>> list = null;
WildcardsMethod(list);
}
我看得出來,我首先需要一Pair<? super Number>
Pair<? super Number>
所以我決定傳入Pair<Number>
結果如下代碼:
? extends Pair<Number>
然后,查看最左邊的通配符,可以使用Pair<Number>
或SubPair<Number>
。 我最終傳遞了List<Pair<Number>>
。
因此,換句話說,我認為最深的通配符要求的是最內邊界(數字)的子類型或超類型。 然后,我轉到頂級通配符,並查找通用類型(Pair)的子類型/超類型。
示例3(沒有意義):
static void WildcardsMethod(List<? super Pair<? super Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Object>> list = null;
WildcardsMethod(list);
}
好吧,就Pair<? super Number>
Pair<? super Number>
,Object絕對是Number的超類型,因此Pair<Object>
應該像前面的示例一樣工作。 以下是我試圖理解這一點的想法:
? super Pair<Object>
所以我僅限於Pair<Object>
或SuperPair<Object>
。 但是,這些都不起作用。
示例4(沒有意義):
static void WildcardsMethod(List<? super Pair<? extends Number>> list)
{
System.out.println("It worked");
}
static void TestWildcardsMethod()
{
List<Pair<Integer>> list = null;
WildcardsMethod(list);
}
這是同一件事。 Pair<Integer>
屬於Pair<? extends Number>
的族Pair<? extends Number>
Pair<? extends Number>
結果如下:
? super Pair<Integer>
然后,我可以傳遞Pair<Integer>
或SuperPair<Integer>
但是,這也行不通。
所以我要么在想這個錯誤,要么以某種方式該模型適用於擴展,但不適用於超級,或者我只是缺少有關下限和嵌套通配符的信息。
范例1:
List<Pair<Integer>>
是List<Pair<Integer>>
的子類型List<? extends Pair<? extends Number>>
List<? extends Pair<? extends Number>>
List<? extends Pair<? extends Number>>
? Pair<Integer>
是Pair<? extends Number>
的子類型Pair<? extends Number>
Pair<? extends Number>
。 是嗎? Integer
是Number
的子類型。 范例2:
List<Pair<Number>>
是List<Pair<Number>>
的子類型List<? extends Pair<? super Number>>
List<? extends Pair<? super Number>>
List<? extends Pair<? super Number>>
Pair<Number>
是Pair<? super Number>
的子類型,那會是Pair<? super Number>
Pair<? super Number>
。 是嗎? Number
是一個超Number
。 范例3:
List<Pair<Object>>
是List<Pair<Object>>
的子類型List<? super Pair<? super Number>>
List<? super Pair<? super Number>>
List<? super Pair<? super Number>>
Pair<Object>
是Pair<? super Number>
的超類型,那將會是Pair<? super Number>
Pair<? super Number>
。 是嗎? 范例4:
List<Pair<Integer>>
是List<Pair<Integer>>
的子類型List<? super Pair<? extends Number>>
List<? super Pair<? extends Number>>
List<? super Pair<? extends Number>>
? Pair<Integer>
是Pair<? extends Number>
的超類型Pair<? extends Number>
Pair<? extends Number>
。 是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.