1

私は 2 つのクラスを持っています。1 つ<T extends Comparable<T>はクラス ヘッダーに itemslf as がclass MaximumTest2 <T extends Comparable<T>>あり、もう 1 つは持って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)、Eclipse で次のエラーが発生しますcannot make a static reference to a non-static type T。これが何を意味するのか分かりませんか?静的にできませんか?
  2. 最後に、phrase とは正確には何を意味するの<T extends Comparable<T>でしょうか?

4

2 に答える 2

3

最初の宣言はMaximumTest ジェネリックになりますが、2 番目の宣言はジェネリックになりません。これはプログラミングの観点からは大きな違いです (ただし、すべてが完了し、コードがコンパイルされると、違いはなくなります。そのため、ジェネリック クラスと非ジェネリック クラスを同じ名前で宣言することはできません)。

静的にすることはできませんが、なぜですか??

できますよ; T2 番目の宣言と同様に、メソッド シグネチャで型パラメーターを宣言するだけです。

public static <T extends Comparable<T>> T maximum(T x, T y, T z)

staticメソッドは、定義上、インスタンスの型パラメーターについて何も知ることができません。

最後に、フレーズとは正確にはどういう意味ですか<T extends Comparable<T>>

簡単に言えば、インスタンスが他のインスタンスと比較Tできるような型でなければならないことを意味します。具体的には、インターフェイスを実装し、その結果、比較を行うメカニズムであるメソッドをサポートする必要があります。TTTComparablecompareTo()

于 2013-09-04T23:33:44.633 に答える
2

クラスの静的メンバー (静的メソッドなど) は、クラスの型パラメーターを継承しません。したがって、静的にMaximumTest2すると、何がmaximum何であるかがわかりませんT。唯一のオプションは、メソッド自体を汎用にすることですが、MaximumTestクラスとその静的maximumメソッドで既にそれを行っています。

と言うときは<T extends Comparable<T>>、上限のあるジェネリック型パラメーターを宣言します。 Tである必要がComparableあり、 の特定の型パラメーターComparableは同じである必要がありますT。たとえば、実装する必要Fooがあるとして使用したいクラスです。TComparable<Foo>

于 2013-09-04T23:33:25.560 に答える