2016-04-01 6 views
6

これは私の教科書からのコードです:Javaジェネリックス型キャスティングが必要ですか?

Stack<String>[] a = (Stack<String>[]) new Stack[N]; 

私の質問は以下のとおりです。

  1. なぜそれが "新しいスタック[N]" とは?
  2. 作成された新しいスタックアレイでタイプ変換を行う必要があるのはなぜですか?私はちょうど

    Stack<String>[] a = new Stack[N]; 
    

でそれを試してみましたが、それがコンパイルされ、罰金走りました。文字列をaにプッシュしてpopメソッドを印刷した後でも。またintを押すとすぐに私にコンパイルエラーが出るので、なぜ型変換する必要があるのですか?

Stack<String>[] 

具体的には?

+2

Java 8を使用していますか?ジェネリックシステムでは、いくつかの点が改善されています。 – Makoto

答えて

4

パラメータ化された型の配列は作成できません(Restrictions on Generics参照)。したがって、... = new Stack<String>[N]は使用できません。 ... = new Stack[N]を使用すると動作しますが、チェックされていない変換について警告が表示されます(警告を表示するには、javacで-Xlintを使用してください)。

唯一の正しい方法は、生のパラメータを使用して配列を作成し、次にチェックされたキャストを目的の型に適用することです。あなたはその質問の意味が、あなた場合は何を意味するか

+0

私は見る!どうもありがとう。私はリンクを読んだが、それは繰り返しであるかもしれないが、今はもっと意味がある。 – Myang310

+0

チェックされたキャストを含めないと何が問題になりますか? – Myang310

+1

実際には害はありません。互換性の理由から未チェックの変換が存在します。古いジェネリック・プリジェネリックス・バージョンのJavaもあります。警告はdevに彼らが一般性を使用すべきであることを思い出させる。 [未チェックの変換](http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.9)を参照してください。 – zer0chain

1
  1. わからない理由ない新しいStack<String>[N]ための私の答えのjavaのarrays does not support parameterized array creation.

  2. は、(1)作成した配列がパラメータ化されていないので、それがありますパラメータ化された変数に代入しています。そのため、オプションですが、チェックされたキャストを優先します。

+0

ああそうです。それはそれのための専門用語です(パラメータ化されていません)。パラメータ化された変数を割り当てずにスタック[N]にしておけば、危険は何か? – Myang310

+0

@ zer0chainが述べたように、本当に危険はなく、ただの警告です。[未チェックの変換](http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1)を参照してください。 9) – gustf

0

最初に気づいたように、キャストは不要です。キャストがなければ、チェックされていない変換警告が表示されます(キャストではキャスト警告が表示されません)。生の型とパラメータ化された型の間の変換は、明示的なキャストなしで行うことができます(警告が表示されます)。

パラメータ化された型の配列を直接作成できない理由について質問している場合、これは、Javaの配列が実行時に、実行時に、配列が作成されたコンポーネント型。すなわち、ランタイムチェックは、何かがアレイのコンポーネントタイプのインスタンスであるかどうかをチェックするためにアレイに置かれるたびに実行される。

コンパイル時にジェネリック型の引数が存在しないため、実行時にinstanceofのパラメータ化された型をチェックすることはできません。それはinstanceof reifiedタイプをチェックすることだけが可能です。配列がパラメータ化された型で作成された場合、実行時に配列に格納されたすべてがその型のインスタンスであることを確認する契約を履行できません。この配列の保証に頼っている人は、予期しない結果を得るでしょう。したがって、あなたがそれをすることを許さないでしょう。しかし、生の型(あなたがやったこと)またはワイルドカード型の型を持つ配列を作成することは、それらがreified型なので大丈夫です。パラメータ化された型の配列として使用していますが、チェックされていない変換(警告あり)を行い、結果として発生する可能性のある安全上の問題について責任を負います。

関連する問題