2009-06-10 8 views
1

は、私はクラス を持っていると私はジェネリック型としてどこかにそれを使用すると仮定します:コンパイル後javaはユーザー定義のジェネリッククラスでも型消去を実装していますか?

class MyList<T> 
{ 
    T[] list=T[10]; 

    public void add(T element) 
    { 
     list[0]=element; 
    } 
} 

それはジェネリックコレクションの場合のように、それは、その種類の情報を削除しますか?

私はどこでもこのコードを使用する必要はありませんので、間違いを見つけることに集中しないでください。私は、コンパイル後にインスタンス変数がObjectクラスの型であることを示すこのコードを通して一般的な質問をしたいだけです。

+2

よく、このコードはコンパイルされないため、一般的な配列を作成することはできません。クラスのパラメータ化は変数のパラメータ化と一致しません – kdgregory

+1

このコードには、ジェネリック配列はまったく作成されていません...私はそこに "新しい"は表示されません: - –

+0

T implicityはObjectを拡張するので、コンパイル時でさえ、Tはコンパイル時のチェックをいくつか持つオブジェクトです。 –

答えて

8

Yes

また、次の点に注意してくださいクラスの

  1. typeパラメータは、その本体に
  2. You can't create a generic arrayをジェネリック型と一致する必要がありますが、あなたはそれを宣言することができます。その背後にある論理的根拠は、allowing construction of generic arrays would make java not type-safe anymoreです。代わりにarraylistを使用してください。
+0

私はなぜ私がdownvotedされているか知りたいです。 – akappa

+0

なぜ私はいくつかのことが控え目にされている理由について神秘的です。あなたの答えは正確で有用なので、私から+1してください。 – Eddie

+0

ポイント2が間違っています:配列CANは汎用です。ジェネリック配列を作成することはできません。入れ子のクラスArrays.ArrayListのコードを参照してください...(
は改行でなければなりません)コンパイルする必要があります:
public class Test {
プライベートT []リスト;
public Test(T [] aList){
list = aList;
}
} –

5

私はコンパイルされるかどうかもわかりません。それは少なくとも警告を出すべきです。

ここでの問題は、配列が共変であることです。ジェネリックはそうではありません。これは、ジェネリックスが実行時に型情報を保持しないことを意味します。配列は行います。

はい、これは、ユーザー定義を含むすべての汎用タイプに適用されます。

+0

ありがとうコードはちょうどfr example.iちょうどそのケースかどうかを知りたいと思ったfrもユーザー定義。 –

関連する問題