为什么 T extends Comparable<? super T> 包括 T?意思是包括 Comparable<T> 吗?

3
class BinarySearch<T extends Comparable<? super T> >

为什么 T extends Comparable <? super T> 包括 T,意味着包括 Comparable<T> 而不仅仅是超类层次结构?我对 super 关键字感到困惑,因为我认为 super 只包括超类项。我是 Java 新手,在 Java 书中有以下示例:
这是关于一个类中的方法,该方法试图使用 Java.awt.Component 限制层次结构的上限和下限,所以该类扩展了 Container。
class CustomComponent<T extends Container>

在这个类中,他们有以下方法:
void describeComponent<CustomComponent<? super JPasswordField> ref)

然后继续说:

请注意,JPasswordField是JTextField的超类,但它本身被省略在允许对象列表中。


以上结构的目的是,如果你有一个 class Animal implements Comparable<Animal>class Dog extends Animal,则该约束将接受所有可与 Animal 进行比较的 Dog,即使它不能与 Dog 具体相比。话虽如此,你也不希望阻止这种情况- ? super T 意味着不仅仅是 T 的超类,而是 "T 或者其任何超类"。 - millimoose
2
你有那个describeComponent方法文档的链接吗?它似乎是错误的(或者可能是混淆了),但没有更多的上下文很难确定。 - Alan Stokes
Java编程 作者:Poornachandra Sarang 出版商:麦格劳-希尔 出版日期:2012年1月20日 印刷版ISBN-13:978-0-071-63360-4 电子书ISBN-13:978-0-071-63361-1 印刷版页数:672页 - bjackfly
到目前为止,您已经学习了有界类型和通配符。有界类型将限制泛型使用的类型设置为某个类层次结构。通配符允许您替换泛型参数类型中允许的任何类型。在某些情况下,您可能希望同时设置范围内使用的类的上限和下限。例如,请查看图12-1中的类层次结构。这在Bounded Wildcards部分中。 - bjackfly
2个回答

7
来自Java教程泛型部分的下界通配符一节:

... 下界通配符将未知类型限制为特定类型或该类型的超类型

(粗体是我加的,强调是他们的)

因此,与T extends Comparable<T>匹配的类的集合是与T extends Comparable<? super T>匹配的类的集合的子集。通配符? super T本身匹配TT的任何超类。

换句话说,“super只包括超类项”的假设是错误的。

你在这个例子中的困惑可能也源于 JTextField超类JPasswordField 是它的一个扩展类;换句话说,JPasswordField extends JTextField。这个例子将匹配以下任何一个类:
  • javax.swing.JPasswordField
  • javax.swing.JTextField
  • javax.swing.JTextComponent
  • javax.swing.JComponent
  • java.awt.Container
  • java.awt.Component
  • java.lang.Object
这个例子改为以下形式会更容易理解:
void describeComponent(CustomComponent<? super JTextField> ref) {...}

Note that JPasswordField, which is a subclass of JTextField, itself is omitted in the list of permissible objects, because it is not a superclass of JTextField.


这很有道理,所以在你的例子中包括JTextField,但不包括JPasswordField,因为它扩展了JTextField。这更有意义,谢谢澄清。我认为他们对“super”的定义不清楚,这似乎更合乎逻辑。谢谢。 - bjackfly

4
我认为 "<T extends Comparable<? super T> >" 的语义意思是,T 或 T 的超类必须实现 Comparable 接口。

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