以下通用声明在Java中有何不同?

时间:2013-09-04 23:29:52

标签: java generics static comparable

我有两个类,其中一个在类标题iteslf中<T extends Comparable<T>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>

2 个答案:

答案 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必须为ComparableComparable的具体类型参数必须相同T。例如,您要用作Foo的{​​{1}}类必须实现T