2009-07-30 12 views
7

私は今、StackクラスJavaの生タイプとジェネリック医薬品の相互作用

class Stack<E> {} 

を持っている場合は、私がしなければ:

1)Stack<Integer> s = new Stack()

2)Stack s = new Stack<Integer>()

3)Stack s = new Stack()

誰でも私にこれらの相互作用(gener ic < - > raw)が原因ですか?

主に私の疑問はポイント1です。実際に私が割り当てを行うと、そのスタックはInteger以外のタイプを格納できるので安全ではありません。はい、私はプッシュメソッドを持っていて、 Integer以外の値をコンパイラで停止しようとしています...そういった場合、安全でない操作をしていましたか?

+0

私はそれを得ることができません - あなたはIntegers(例えばIntegersとDoubles)他のものを押すことができるスタックを持っていますか、あるタイプ(Integer)でスタックを使いたいですか?助けます? –

+1

いいえ1つのタイプのスタックが必要で、割り当てを するとどうなるか知りたいです。 – xdevel2000

答えて

6

Javaのジェネリックは、type erasureの意味で、構文的な砂糖なので、これらのすべては安全ではありません。たとえば、これは完全に有効なJavaコードです。

Stack<Integer> s = new Stack<Integer>(); 
Stack<Double> s2 = (Stack<Double>)s; 
s2.push(3.3d); 

Javaジェネリックのポイントは、オブジェクトのキャストについて明示的にする必要はありません。それでおしまい。彼らはそれ以上のことはしません(コンパイラとIDEの警告を生成することを除いて)。

これらはまだ有用であり、コードをはるかに読みやすく、エラーを起こしやすいものにすることができますが、最終的にバイトコードレベルでは、何もしないことを理解することが重要です。

+0

はOPのケースではありません#2コンパイラがスマートなので、sのジェネリック型引数を推論するのは難しいですか? –

+0

はい、しかし、ポイント1では、Integer以外のオブジェクトを(プッシュ操作で)入れようとすると、コンパイラは私に助言します。だから、ジェネリックスは「構文的な砂糖」だけでなく、コンパイラの動作(意味論)も変更することがあります。だから私は再び安全でない場所が分からない...もっと分かりやすい解説をくれないか? – xdevel2000

7

StackStack<Integer>の間に実際の実行時の違いがないため、3つは完全に合法ですが、3つすべてがコンパイラの警告になります。

Stack<Integer> s = new Stack() 

それがパラメータ化された型への生タイプを変換するために、一般的に安全ではないので、これは、「未チェックの変換」警告になります。ただし、この場合は完全に安全です。Integerの値を押してもエラーは発生しません。非Integerの値を押すと、タイプエラーが発生します。

Stack s = new Stack<Integer>() 

これは、パラメータ化された型から生の型への正当な変換です。任意のタイプの値をプッシュできます。ただし、そのような操作を行うと、「未チェック通話」という警告が表示されます。

Stack s = new Stack() 

この場合も、これは暗黙の変換なしで有効です。任意のタイプの値をプッシュできます。ただし、そのような操作を行うと、「未チェック通話」という警告が表示されます。

タイプStackを参照すると、いつでも「生のタイプ」の警告が表示されることがあります。

関連する問題