2016-10-06 18 views
0

私はStackOverflowのコメント付きコードのこのセクションに出くわしました。ランタイム例外がスローされます。 2番目の部分(コメントされていないセクション)が動作します。両方のメソッドがオブジェクトの配列を返すので、私は2つの違いを見つけることができません。たぶん私は基本的な理解を欠いているかもしれません。手伝ってくれませんか?文字列の配列対オブジェクトの配列java

+1

例外は何ですか? – Jens

+5

ジェネリック型変数に 'Object'のような名前を使用することは非常に悪いことです。 –

+0

不必要な繰り返しがあります。 'asArray'は間違っているが' display 'ではない方法はない。 – ChiefTwoPencils

答えて

0

キャストに問題があると思います。あなたが一部を使用する場合、コンパイラが実際に見ているものを

static <Object> Object[] display(Object... args) 

static <Object> Object[] display(Object[]... args) 

あり、それはさらにこれがであってはならない値を許可する可能性がある。この

static <Object> Object[] display(List[]... args) 

に変換しますそこに

あなたは文字列のオブジェクト配列を作成し、それにintを追加しようとすることができます。これは異なるタイプの問題を引き起こすでしょう。ジェネリックオブジェクトを使わずに再加工したいかもしれません。

@SafeVarargsタグを使用することもできます。

+1

コンパイラは、 'Object ... 'を見るときに' Object [] 'を見て、' List'は関係しません。 – Kayaman

0

これは興味深い状況です。最初の例では、Javaはオブジェクト配列から文字列配列へのキャストについて不平を言っています。

java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.String;にキャストすることはできません。

2番目のケースでは、問題なく処理できます。問題はタイプ消去のようです。 asArrayが返されると、そのパラメータに基づいて型付けされた配列が返されます。その情報は、Object[]と単純になるarrayOfTwoのコンテキスト内で消去され、内容が文字列であることはもはや利用できません。

型消去および非修飾型、およびvarargsへの影響については、this postをご覧ください。これは「可能ヒープ汚染」について、コードを生成する警告にいくつかのコンテキストを提供しない。

Safevarargs.java:11:警告:[未確認]可能ヒープ汚染パラメータ化された可変引数型オブジェクトから
静的オブジェクトを[ 】表示(オブジェクト...引数){オブジェクトが型変数である
^:ドキュメントから
オブジェクトがjava.lang.Objectのメソッドディスプレイ内で宣言延び(オブジェクト...)

ヒープ汚染は、パラメータ化された型の変数が、そのパラメータ化された型ではないオブジェクトを参照する場合に発生します。

0

この問題を説明するには、Javaの一般的な仕組みを知る必要があります。コンパイラは、コンパイルのプロセス中にジェネリック型情報を内部的に使用し、ソースを処理する際に型関連のエラーを生成します。次に、検証が完了すると、コンパイラはジェネリック型の参照をそれぞれの型の消去で置き換えて、型消去されたバイトコードを生成します。

2番目の例では、コンパイル時にstringにコンパイルされます。最初の例では、asArrayは別の汎用メソッドによって呼び出されるため、コンパイル時にObjectにコンパイルされます。その結果、実行時にObject []をString []にキャストすることができず、クラスキャスト例外がスローされます。これがあなたを助けることを願って

関連する問題