3

我有这个方法,它采用实现接口 Comparable 的 T 类型的 3 个参数

public static < T extends Comparable< T > > T maximum( T x, T y, T z ) {}

我在询问以其他方式声明它,如下所示(假设它采用任何 Comparable 对象作为其参数)

public static <Comparable <T>> T maximum (T x, T y, T z){}

另一个问题,在第一个声明中,我知道 Comparable 是一个接口,所以为什么它写成<T extends Comparable<T>>而不是<T implements Comparable<T>>??

4

3 回答 3

4

public static <Comparable <T>> T maximum (T x, T y, T z){}未编译,因为该方法的参数 T 未声明。

我知道 Comparable 是一个接口,所以为什么它写为 > 而不是 >??

有界类型参数的语法是 with extendsnot implements,即使该参数是实现接口所必需的。

于 2013-03-22T11:27:54.313 回答
3

您的两个问题都可以回答:这是 Java 语法。在 Java 语言中,参数化方法声明如下:

[optional modifiers] <T> [return type] foo() {}

声明了一个名为的类型参数T,可以使用以下语法限制其上限:

T extends [type expression]

在方法的其余部分(返回类型、形参列表、方法体)T是指调用方法时传递的类型。在如下声明中:

Comparable<T>

T不是类型参数,但它是用于实例化参数化类型的类型Comparable<E>参数,并且属于更大的范围,例如:

class Foo<T> {
  public Comparable<T> foo(T arg1, T arg2) {}
}

请注意,<Comparable<T>>根本不允许源文件中的文本(用尖括号括起来的类型)。这对编译器没有任何意义,它会拒绝编译文件。

同样,关于您的第二个问题,extends它只是 Java 语言中的一个关键字,具有两种不同的含义:

  1. 它可以在类声明中用于继承另一个类
  2. 它可用于为类型参数设置上限

Java 创建者本可以决定使用不同的关键字来区分这两种情况,但他们只是重载了现有的一种,因为他们觉得开发人员更容易记住它。但它们绝对是不同的关键字,这就是为什么在声明类型参数的上限时不使用implements的原因。

于 2013-03-22T11:34:24.033 回答
0

查看 Javadoc 的Collections.sort. 签名是:

public static <T extends Comparable<? super T>> void sort(List<T> list)

如果我有的话就是这样

class A implements Comparable<A> {...}
class B extends A {...}
// ...
List<B> bs = ...
Collections.sort(bs);

我可以对 List 进行排序,因为 B 可以通过 A 类的比较器进行比较。所以,写:

public static < T extends Comparable< ? super T > > T maximum( T x, T y, T z ) {}
于 2013-03-22T11:32:50.187 回答