1

我有两个类,一个在<T extends Comparable<T>类标题中包含 itemslf class MaximumTest2 <T extends Comparable<T>>,另一个在其中包含public class MaximumTest但方法扩展了 Comparable,如下面的代码所示。

  1. 实现方式有什么不同,一种比另一种更好。顺便说一句,上面两个类做同样事情的方式。

    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" ) );
       }
    

    }

    1. 当我尝试使方法public T maximum(T x, T y, T z)静态时,我在 Eclispe 中收到以下错误:cannot make a static reference to a non-static type T. 我不明白这是什么意思?我不能让它静态吗?
  2. 最后,短语究竟是什么意思<T extends Comparable<T>

4

2 回答 2

3

好吧,您的第一个声明是MaximumTest 通用的,而第二个则不是;从编程的角度来看,这是一个很大的区别(尽管当一切都说完并且你的代码被编译时,差异被消除了——这就是为什么你不能声明一个泛型类和一个具有相同名称的非泛型类)。

不能让它静态,但为什么?

你当然可以; 您只需要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()方法、进行比较的机制。

于 2013-09-04T23:33:44.633 回答
2

类的静态成员(例如静态方法)不继承类的类型参数。因此MaximumTest2,如果您要制作maximum静态,那么它就不会知道是什么T。您唯一的选择是使方法本身具有通用性,但是您已经使用您的MaximumTest类及其静态maximum方法做到了这一点。

当您说 时<T extends Comparable<T>>,您声明了一个具有上限的泛型类型参数。 T必须是Comparable,并且具体的类型参数Comparable必须相同T。例如,Foo您想使用的类T必须实现Comparable<Foo>.

于 2013-09-04T23:33:25.560 回答