1

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

E[] arrayVar = (E[])new Object[1];// It causes a compiler warning 

問題は、どのような状況でコードが実行時エラーを引き起こすかということです。

4

3 に答える 3

4

そのコードは、結果を の具体化された型に代入しようとした場合にのみ実行時エラーを引き起こします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.

于 2012-08-31T02:07:54.927 に答える
1

LastStar007の回答を拡張するには

このステートメントの問題は、Javaが実行時までオブジェクトEのタイプを判別できないことです。また、残念ながら、javaは、指定されたオブジェクトのタイプを判別する簡単な方法を提供していません(getClass()はこれに対して機能しません)。

(数値データの場合)最善の策は、各ニーモニックの最大値をチェックするか、文字データをチェックすることです。文字ごとのストレージサイズをチェックします。はい、退屈に聞こえますが、JavaにはC ++のようなtypeinfoがないため、作業がはるかに簡単になります。

于 2012-08-31T01:27:37.157 に答える
-2

コンパイル時エラーが常に発生するため、実行時エラーが発生することはありません。をにObjectダウンキャストできないEため、Object[]を にダウンキャストできませんE[]。それを超えて、クラスはコンパイル時にE型が何であるかわからないため、型の配列を作成することはできません。E

于 2012-08-31T01:23:36.920 に答える