我有这个方法,它接受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>>
??
答案 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语言中的一个关键字,有两个不同的含义:
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 ) {}