0

私はジェネリックを理解しようとしています。以下のコードでは、 getDuplicate() の戻り値の型PlaceHolder<X,X>に同じパラメーター X があり、正常にコンパイルされます。しかし、同じパラメーター型を使用すると、MyClass<T,T>「型変数 T は既に定義されています」と表示されます。getDuplicate メソッドでそれがどのように可能であるかを誰かが説明できますか?

class PlaceHolder<K,V> {
   public K k;
   public K v;

   public PlaceHolder(K k, K v){
       this.k = k;
       this.v = v;
   }

   public K get(){ return k;    }

   public static <X> PlaceHolder<X,X> getDuplicateHolder(X x){
        return new PlaceHolder<X,X>(x,x);
   }

}

class MyTest<T,T> {}
4

1 に答える 1

3

違いは、Xが 1 回宣言されて 2 回使用されるのに対し、 は 2 回T宣言されていることです。

メソッドでは、after 修飾子を使用して型パラメーターを宣言できますが<>、戻り値の型の前に宣言できます。同様に、クラスとインターフェイスでは、クラス名の後、implementsand/orextends句の前、およびクラス/インターフェイス本体の前に、型パラメーターを宣言できます。

これらの型パラメーターは、宣言されているスコープで使用できます。戻り値の型の宣言PlaceHolder<X, X>は 2 回使用Xしていますが、クラスの宣言は2 回MyText<T, T>宣言しようとしていTます。

変数に相当するアナロジーは、変数を宣言し、それを 2 回使用することです。

int x;
...
x + x

対、同じ名前で 2 つの変数を宣言しようとしています。

int t;
int t;

型パラメーターを宣言するときと、既存の型パラメーターを使用するときを知っていることを確認する必要があるだけです。

于 2016-04-28T21:14:59.403 に答える