【问题标题】:Usage of super in method declaration方法声明中 super 的使用
【发布时间】:2016-03-22 11:56:03
【问题描述】:

我想了解这个 Java 声明在做什么:

public static <AnyType extends Comparable<? super AnyType>> int mymethod( AnyType x ) {
    /* ... */
}

根据我对 Java 的基本知识,我认为它所做的只是告诉您参数 x 必须是任何类型,但该类型必须扩展 Comparable?

【问题讨论】:

  • 没有。这意味着该类型必须是 AnyType 的子类型。
  • 下次请先做一些研究。

标签: java generics methods super


【解决方案1】:

你的理解是正确的。此方法表明它采用扩展 Comparable 的类型的参数(请注意,为了便于阅读,我会调用类型参数 T 而不是 AnyType)。

现在对于Comparable&lt;? super AnyType&gt;&gt; 中的super,这意味着这个可比较的实现实际上可以是例如Comparable&lt;Object&gt; 的实现,它是可以与对象进行比较的可比较类型。 更一般地,该方法接受的类型可以是Comparable,可以将其与作为它的超类或超接口的某种类型进行比较,因此关键字@987654328 @。换句话说,该方法可以如下调用:

// An object of this type can be compared to an Object
class X implements Comparable<Object> {

    @Override
    public int compareTo(Object o) {
        ...
    }


}

X x = new X();
mymethod(x);

【讨论】:

  • 谢谢!终于完全明白了^^
【解决方案2】:

这是一个通用方法,即它的类型参数化与类的参数化无关。

&lt;AnyType extends Comparable&lt;? super AnyType&gt;&gt; 部分是该方法的通用参数化。

在声明类时,extends 关键字不应与 extends 关键字混淆:在这种情况下,它看起来更像是“可分配自”,换句话说,IS-A .

Comparable&lt;T&gt; 是一个接口 - 请参阅文档here

您的方法参数化将使您的方法接受任何参数,只要它的类型实现Comparable

具体来说,它必须是自身的Comparable 或任何超类型(这就是super 部分的含义,而不是extends)。

例如,您可以传递 String 参数,因为 String 实现了 Comparable&lt;String&gt;(以及其他)。

【讨论】:

    【解决方案3】:

    是的,参数必须是 Comparable 的子类型。

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多