簡體   English   中英

怎么會 <T extends Comparable<T> &gt;作為 <T extends Comparable<? super T> &gt;?

[英]How come <T extends Comparable<T>> working as <T extends Comparable<? super T>>?

假設我們有

class Fruit implements Comparable<Fruit>
{
    @Override
    public int compareTo(Fruit o) { return 0; }
}

class Apple extends Fruit{}

class Main
{

    public static void main (String args[])
    {
        function(new Apple()); // this shouldn't work because Apple is implementing Comparable<Fruit>, not Comparable<Apple>
    }

    public static<T extends Comparable<T>> void function(T t){}
} 

代碼可以正常工作。

我的問題是為什么<T extends Comparable<T>><T extends Comparable<? super T>>一樣工作<T extends Comparable<? super T>> <T extends Comparable<? super T>> 有什么不同 ?

謝謝。

[編輯]-圖書圖片的一段

在這種情況下,是因為類Fruit是自身的超類

區別在這里

<T extends Comparable<T>>接受Comparable與type T爭論<T extends Comparable<? super T>> <T extends Comparable<? super T>>接受<T extends Comparable<? super T>> type T and its super classes其父type T and its super classes爭論。 由於在Java中每個類都是其自身的超類,因此Fruit is also a superclass of Fruit這就是為什么您看到它們以相同的方式工作的原因,但是如果您將Apple類用作T您會發現其中的區別。

我認為您可以使用Java 8進行編譯。 因為在Java 8之前,您不應該通過編譯並出現以下錯誤:

邊界不匹配:Main類型的通用方法函數(T)不適用於自變量(Apple)。 推斷的類型Apple不是邊界參數的有效替代品>

我認為您在書中所讀的內容是指Java 8之前的通用用法。
但是我不知道Java 8對這種情況的約束較少。
Java 8稱為“改進的推理”是否是Java 8中大量使用推理的副作用?

暫無
暫無

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

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