簡體   English   中英

Java generics 下限

[英]Java generics lower bound

我清楚地理解上限,但不完全理解下限。 例如我有這個代碼:

public class Main<T> {
    private T t;

    public Main(T t) {
        this.t = t;
    }

    private static class Base {}

    public static void main(String[] args) {
        Main<? super Base> main = new Main<>(new StringBuilder());
        System.out.println(main.t.getClass());
    }
}

為什么盡管StringBuilder不是Base的超級 class ,但編譯期間沒有錯誤。 因為我認為提供不相關的類型是非法的(我知道在類型推斷之后不可能將非子 class 分配給t )。 它還可以與 collections 一起使用,這是否意味着集合可能不存儲任何孩子,沒有Base的超級 class ? 請不要將我鏈接到 PECS 問題,我已經閱讀了很多。

我將添加此作為實際答案。

我認為這里的<T>是 Object,它是 Base 和 StringBuilder 的合法超類型。 基本上,您這樣做/考慮這一點的方式是有缺陷的。 查看此問題的答案(忽略 PECS 的重復文本):

<? 之間的區別 超級 T> 和 <? 在 Java 中擴展 T>

請注意接受的答案給出的示例,尤其是帶有<Object>的示例:

List<? super Integer> foo3 = new ArrayList<Integer>();  // Integer is a "superclass" of Integer (in this context)
List<? super Integer> foo3 = new ArrayList<Number>();   // Number is a superclass of Integer
List<? super Integer> foo3 = new ArrayList<Object>();   // Object is a superclass of Integer

由於您允許菱形運算符“找出” T的類型,因此它“找出” Object可以工作並使用它。 未經測試,但檢查這是否也編譯:

Main<? super Base> main = new Main<Object>(new StringBuilder());

編輯:我看到@markspace 的答案幾乎相同並且在此之前發布的有點晚。 由於 styles 的解釋不同,我只在這里保留它,僅此而已。


這應該是由於菱形運算符<>導致自動推斷基於最可能的路線發生,在這種情況下是構造函數參數。

我找不到菱形運算符的官方描述,但各種來源對其進行了大意描述 - Java 編譯器在給定菱形運算符特性確定與調用匹配的最合適的構造函數聲明時進行類型推斷。

如果您將聲明更改為GenericsSuper<? super Base> main = new GenericsSuper<StringBuilder>(new StringBuilder()) GenericsSuper<? super Base> main = new GenericsSuper<StringBuilder>(new StringBuilder())你會得到你預期的錯誤。

如果沒有這個顯式聲明,由於super限制, <>會導致<Object> ,因此任何事情都是允許的,因為:

  • GenericsSuper中的代碼與StringBuilder沒有問題。 它只想要T
  • BaseObject中與StringBuilder有一個共同的超級。

暫無
暫無

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

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