为什么T扩展了Comparable <! - ?超级T - >包括T?含义包括Comparable <t>?</t>

时间:2013-08-10 15:59:23

标签: java super

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的超类,它本身在允许的对象列表中被省略。

2 个答案:

答案 0 :(得分:7)

来自Lower Bounded Wildcards The Java Tutorial Generics部分的一部分:

  

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

(大胆的,强调他们的)

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

换句话说,“super仅包含超类项目”的假设完全不正确。

您在示例中的混淆也可能源于JTextFieldJPasswordField超类这一事实;换句话说,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) {...}
     

请注意,JPasswordField是JTextField的子类,它本身就是   在允许的对象列表中省略,因为它不是   JTextField的超类。

答案 1 :(得分:3)

我相信“&lt; T延伸Comparable&lt;?super T&gt;&gt;”的语义含义 是T还是T的超类必须实现Comparable