2011-01-20 6 views
4

私はJavaでジェネリックスを研究しています。 コンパイル時に消去がすべての一般情報を消去することを勉強しました。削除の詳細は?

ここでは、すべてのTがObjectに置き換えられたことを調べました。私はそれが

Integer v = (Integer)display(2); 
String d = (String) display("3"); 
public Object display(Object i){ 
return i; 
} 

に変わることを願っています

Integer v = display(2); 
String d = display("3"); 

public <T> T display(T i){ 
     return i; 
    } 

だから、私の仮定が正しいですか?

ありがとうございました。

答えて

4

あなたは基本的にそれを持っています。コンパイラは汎用パラメータ型を使用してコードを検証しますが、生成されたバイトコードは別のクラスに置き換えられます。

<T>などのバインドされていない汎用パラメータの場合は、Objectとなります。ただし、宣言が<T extends Comparable>の場合、置換クラスはObjectの代わりにComparableとなります。

編集:パーツでの情報と実際に密集いえJavaのジェネリックについてグレート情報、:

JavaのジェネリックのFAQ - よくあるご質問
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+0

リンクは非常に便利感謝です。 – Manoj

0

基本的には、はい。 Javaのジェネリックスは素晴らしいコンパイラのトリックです。

1

ジェネリック型に関する情報は、コンパイルされたクラスには保存されません。コンパイル時にのみ型の安全性をチェックするために使用されます。

Integer v = display(2); 

Javaコンパイラは、その方法は「汎用」であることを知っている、そしてそれは整数である。この場合には、その引数と同じ型を返し、結果が整数に割り当てられているので、すべてがOKです。

String d = display("3"); 

全く同じトリックです。しかし、その場合には:

Long v = display(2); 

Javaは2が整数であることを意味するので、それは、キャストができないことを教えてくれますし、Javaはロングにキャストすることはできませんので、あなたが記述する必要があります。

私が言われたよう
Long v = display(2L); 

、何の情報は、あなたがStringタイプのList<Integer>値に入れることができ、実行時間の間、その潜在的に、コンパイルされたクラスに保存されていない、と例外がスローされませんが、あなたがこのStringを読み、しようとしたときに割り当てますInteger型変数を取得します...まあ、かなりトリッキーです;)