怎么来<t extends =“”可比<t =“”>&gt;作为<t extends =“”比较<?=“”super =“”t =“”>&gt;?

时间:2016-11-19 08:30:53

标签: java

假设我们有

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>>一样工作。有什么不同 ?

感谢。

[编辑] - 书中的一段 Image

2 个答案:

答案 0 :(得分:0)

在这种情况下,beacuse类Fruit是其自身的超类

不同之处在于

<T extends Comparable<T>>接受与type T的争论相比较 <T extends Comparable<? super T>>接受与type T and its super classes的争论相比较。这里因为在java中,每个类都是它自己的超类,Fruit is also a superclass of Fruit。这就是为什么你看到它们以同样的方式工作 但如果您使用Apple作为T,则会看到差异。

答案 1 :(得分:0)

我认为您使用Java 8进行编译。 因为,在Java 8之前,您不应该传递编译并出现此错误:

  

绑定不匹配:Main类型的泛型方法函数(T)不是   适用于论点(Apple)。推断类型Apple不是   有效参数&gt;

的有效替代

我认为你在书中看到的内容是指Java 8之前的泛型用法 但我不知道Java 8对这种情况的限制较少。
在Java 8中大量使用推理的副作用是Java 8调用&#34;改进的推理&#34; ?