通用方法类型参数

时间:2013-03-22 11:22:01

标签: java generics

我有这个方法,它接受3个T类参数来实现接口Comparable

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>> ??

3 个答案:

答案 0 :(得分:4)

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

  

我知道Comparable是一个界面,所以为什么它被写成&gt;而不是&gt; ??

有界type parameters的语法是extends而不是implements,即使参数是实现接口所必需的。

答案 1 :(得分: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. 它可用于在类型参数上加上上限
  3. Java创建者可能决定使用不同的关键字来区分这两种情况,但他们只是重载现有的一种,因为他们觉得开发人员更容易记住。但它们肯定是不同的关键字,这就是为什么在声明类型参数的上限时不使用 implements 的原因。

答案 2 :(得分:0)

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

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 ) {}