Java泛型练习 - 答案解释

3
在官方的Java文档中,泛型章节末尾有一些练习题和答案。我已经解决了大部分问题,但是有一个答案对我来说不太清楚。您可以在这里找到问题和答案。我不明白第8个问题的答案。为什么他们要写:
<T extends Object & Comparable<? super T>>

我已经写了

<T extends Comparable<? super T>>

我不明白为什么需要或者说有必要使用extends Object。


这个“技巧”的更多讨论在这里:http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ104 - Chris K
感谢您的评论,它们非常有帮助!据我所知,对象扩展并不是必需的,只是为了不破坏遗留API而插入的,这更或多或少是一个错误。因此,按照我所做的方式完全没有问题(甚至更好)。 - Sebastian Bechtel
@user1361466 这是我理解的方式,虽然它可能更像是一种特性而不是一个bug ;) 在添加泛型时,语言设计者决定保持与之前Java版本的向后兼容性,并因此(不管对错)在泛型方面做出了很多妥协。 - Chris K
@ChrisK 我的意思是将 Object 定义为 max 方法的返回类型而不是 Comparable 是一个 Bug。 - Sebastian Bechtel
1个回答

1
我需要仔细考虑一下。原因如下:
如果你写了:
<T extends Comparable<? super T>>

这意味着你的 T 必须要 扩展 Comparable。而你想要的是让它 实现 Comparable
为了做到这一点,你需要让它扩展一个类并明确必须实现哪些接口。
由于你不需要任何特殊的类,所以必须扩展 Object,完成后,可以明确要实现的接口。
语法:
<T extends ClassToExtend & InterfaceToImplement>

如果我省略了Object扩展,那么据我所知,T不需要是一个接口,而是一个类型。正如上面的评论所建议的那样,问题似乎是要兼容需要返回类型为Object的旧代码,但在这里经过类型擦除后,我们得到了Comparable。 - Sebastian Bechtel
不完全正确。对于 <T extends Comparable<? super T>>T 可以是任何类型、接口或类,只要它是 Comparable 的子类或本身即可。 - Bohemian
好的,我不知道一个类可以扩展一个接口...我会更新我的答案。 - SteeveDroz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接