我有两个类,其中一个在类标题iteslf中<T extends Comparable<T>
为class MaximumTest2 <T extends Comparable<T>>
,另一个在public class MaximumTest
,但是方法扩展为Comparable,如您所见在下面的代码中。
实施方式有何不同,比其他方式更好。顺便说一句,上面两个班级做同样的事情。
class MaximumTest2 <T extends Comparable<T>>
{
// determines the largest of three Comparable objects
public T maximum(T x, T y, T z) // cant make it static but why??
{
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ){
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ){
max = z; // z is the largest now
}
return max; // returns the largest object
}
}
public class MaximumTest
{
// determines the largest of three Comparable objects
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // assume x is initially the largest
if ( y.compareTo( max ) > 0 ){
max = y; // y is the largest so far
}
if ( z.compareTo( max ) > 0 ){
max = z; // z is the largest now
}
return max; // returns the largest object
}
public static void main( String args[] )
{
MaximumTest2 test2 = new MaximumTest2();
System.out.println(test2.maximum(9, 11, 5));
System.out.printf( "Max of %d, %d and %d is %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "Maxm of %.1f,%.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
System.out.printf( "Max of %s, %s and %s is %s\n","pear",
"apple", "orange", maximum( "pear", "apple", "orange" ) );
}
}
public T maximum(T x, T y, T z)
设为静态时,我在Eclispe中遇到以下错误:cannot make a static reference to a non-static type T
。我不明白这意味着什么?我可以不让它静止吗?最后,短语的确切含义是<T extends Comparable<T>
?
答案 0 :(得分:3)
嗯,你的第一个宣言是MaximumTest
generic,而第二个宣言没有;从编程的角度来看,这是一个很大的不同(尽管当所有的事情都说完了并且你的代码被编译时,差异就会被删除 - 这就是为什么你不能声明泛型类和具有相同名称的非泛型类)。
不能让它静止,但为什么?
当然可以;你只需像在第二个声明中那样在方法签名中声明类型参数T
:
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
根据定义, static
方法对实例的类型参数一无所知。
最后,短语恰恰意味着
<T extends Comparable<T>>
简单来说,这意味着T
必须是T
个实例与其他T
实例相当的类型。具体来说,T
必须实现Comparable
接口,因此支持compareTo()
方法,即完成比较的机制。
答案 1 :(得分:2)
类的静态成员(例如静态方法)不继承类的类型参数。因此,对于MaximumTest2
,如果您要使maximum
为静态,那么它将不知道T
是什么。您唯一的选择是使方法本身具有通用性,但是您已经使用MaximumTest
类及其静态maximum
方法执行此操作。
当您说<T extends Comparable<T>>
时,您声明一个带有上限的泛型类型参数。 T
必须为Comparable
,Comparable
的具体类型参数必须相同T
。例如,您要用作Foo
的{{1}}类必须实现T
。