簡體   English   中英

下限嵌套通配符

[英]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:

  1. List<Pair<Integer>>List<Pair<Integer>>的子類型List<? extends Pair<? extends Number>> List<? extends Pair<? extends Number>> List<? extends Pair<? extends Number>>
  2. 如果Pair<Integer>Pair<? extends Number>的子類型Pair<? extends Number> Pair<? extends Number> 是嗎?
  3. 是的,因為IntegerNumber的子類型。

范例2:

  1. List<Pair<Number>>List<Pair<Number>>的子類型List<? extends Pair<? super Number>> List<? extends Pair<? super Number>> List<? extends Pair<? super Number>>
  2. 如果Pair<Number>Pair<? super Number>的子類型,那會是Pair<? super Number> Pair<? super Number> 是嗎?
  3. 是的,因為Number是一個超Number

范例3:

  1. List<Pair<Object>>List<Pair<Object>>的子類型List<? super Pair<? super Number>> List<? super Pair<? super Number>> List<? super Pair<? super Number>>
  2. 如果Pair<Object>Pair<? super Number>的超類型,那將會是Pair<? super Number> Pair<? super Number> 是嗎?
  3. 不它不是。 具有特定參數的參數化類型永遠不能是帶有通配符的參數化類型的超類型。

范例4:

  1. List<Pair<Integer>>List<Pair<Integer>>的子類型List<? super Pair<? extends Number>> List<? super Pair<? extends Number>> List<? super Pair<? extends Number>>
  2. 如果Pair<Integer>Pair<? extends Number>的超類型Pair<? extends Number> Pair<? extends Number> 是嗎?
  3. 不它不是。 具有特定參數的參數化類型永遠不能是帶有通配符的參數化類型的超類型。

暫無
暫無

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

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