2

私はいくつかの一般的な制限を読みました

キャストに関しては、パラメーター化された型でキャストを使用できないと言われました

必要に応じてジェネリックが自動的にキャストを実行するため、オブジェクトデータ型をそのサブクラスにキャストできる状況を誰かが説明できますか?

次のコードがあるとします。

T[] arrayVar =(T[]) new Object[1]// コンパイラの警告が発生しますが、問題ありません

この状況でキャストを使用する必要があるのはなぜですか? ジェネリックでは、キャストは自動的に行われるとは言いませんか?

4

1 に答える 1

1

Tが として定義されていないと仮定すると<T extends NotObject>

T[] arrayVar =(T[]) new Object[1]// it causes a compiler warning but still okay

投稿消去は

Object[] arrayVar = (Object[]) new Object[1];

冗長なチェックされていないキャストがあります。

これは型安全ではありません。

したときにどうなるかを考える

f(arrayVar)

どこ

void f(Object[] out) { out[0] = "A string"; }

Stringがのサブクラスではないときにそれが発生する可能性がある場合Tは、タイプ セーフ違反があります。


この問題を解決するには、より具体的なタイプの配列を作成してみてください。タイプのパラメーターを取得できる場合

Class<T> clazz

次に、このように配列を作成できます

T[] varArray = (T[]) Array.newInstance(clazz, 1);

やろうとしているので、これはより型安全です

out[0] = "";

Number[]たとえばon aはArrayStoreExceptionat runtime になります。

これは完全に (動的に) タイプ セーフではありませTん。List<String>List<Number>List[]ArrayStoreException

于 2012-08-30T21:05:06.680 に答える