3

次の 2 つのバージョンの Java ジェネリック クラスの違いがあれば、詳しく説明してください。

class C<T>{
    T x;
    void foo(T y)  { … }
}

class C<T>{
    T x;
    <T> void foo(T y)  { … }
}

もう 1 つの質問: Java コンパイラが C の最初のバージョンを受け入れ、C の 2 番目のバージョンを拒否する「…」を置き換える、foo() の本体に何が書かれている可能性がありますか。

とても困惑しています。

4

2 に答える 2

10
class C<T>{
    T x;
    <T> void foo(T y)  { … }
}

紛らわしい書き方です

class C<T>{
    T x;
    <S> void foo(S y)  { … }
}

2番目のバージョンを拒否するものについては、たとえば次のようになります。

class C<T>{
    T x;
    <T> void foo(T y)  { x = y; }
}

次のように書き換えると失敗します。

class C<T>{
    T x;
    <S> void foo(S y)  { x = y; }
}

キャストが欠落していることはすぐにわかります (正確なコンパイラ エラーは「互換性のない型」です)。

于 2012-05-12T22:13:02.610 に答える
2

最初の例ではT、メソッドの型変数はfoo、クラス定義で宣言されているものとまったく同じ型を表していますC<T>

2 番目の例は落とし穴です。Tメソッド宣言内の は、クラスの型パラメーターとは無関係のまったく異なる型であり、たまたま同じ名前を持っているためTです。ローカル変数が同じ名前のフィールドを非表示にする状況と同様のケースです。

Eclipse は、次の状況で優れたコンパイラ警告を発します (この警告が設定でオンになっている場合、デフォルトでオンになっているかどうかはわかりません)。

型パラメーター T は型 T を隠しています

于 2012-05-12T22:20:47.600 に答える