次のコードがあるとします
E[] arrayVar = (E[])new Object[1];// It causes a compiler warning
問題は、どのような状況でコードが実行時エラーを引き起こすかということです。
そのコードは、結果を の具体化された型に代入しようとした場合にのみ実行時エラーを引き起こしますE
。
createArray(); // no exception
String[] arr = createArray(); // causes ClassCastException
public static <E> E[] createArray() {
return (E[]) new Object[1];
}
ジェネリック配列を作成する安全な方法は、次を使用することですArray.newInstance
。
public static <E> E[] createArray(Class<E> component) {
return (E[]) Array.newInstance(component, 1);
}
この方法では、ClassCastException
.
LastStar007の回答を拡張するには
このステートメントの問題は、Javaが実行時までオブジェクトEのタイプを判別できないことです。また、残念ながら、javaは、指定されたオブジェクトのタイプを判別する簡単な方法を提供していません(getClass()はこれに対して機能しません)。
(数値データの場合)最善の策は、各ニーモニックの最大値をチェックするか、文字データをチェックすることです。文字ごとのストレージサイズをチェックします。はい、退屈に聞こえますが、JavaにはC ++のようなtypeinfoがないため、作業がはるかに簡単になります。
コンパイル時エラーが常に発生するため、実行時エラーが発生することはありません。をにObject
ダウンキャストできないE
ため、Object[]
を にダウンキャストできませんE[]
。それを超えて、クラスはコンパイル時にE
型が何であるかわからないため、型の配列を作成することはできません。E