首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么<T扩展Comparable<T>>,而<T扩展Comparable<?超级T>>?

为什么<T扩展Comparable<T>>,而<T扩展Comparable<?超级T>>?
EN

Stack Overflow用户
提问于 2016-11-19 08:30:53
回答 2查看 664关注 0票数 2

假设我们有

代码语言:javascript
复制
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>>一样工作。有什么区别吗?

谢谢。

编辑- 图像书中的一篇短文

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-19 09:36:40

我认为您是用Java 8编译的。因为在Java 8之前,您不应该传递编译并有以下错误:

绑定不匹配: Main类型的泛型方法函数(T)不适用于参数(Apple)。推断类型Apple不能有效地替代有界参数>

我认为你在书中读到的是Java 8之前的通用用法。

但我不知道Java 8对这种情况的约束较少。

Java 8所称的“改进推理”是Java 8中大量使用推理的副作用吗?

票数 0
EN

Stack Overflow用户

发布于 2016-11-19 08:51:34

在本例中,它是因为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 .Thats --为什么您看到它们的工作方式相同--但是如果您使用类Apple作为T,您就会看到区别。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40690788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档