[解決済み] Javaで汎用配列を作成する方法は?
2022-03-16 09:15:17
質問
Java のジェネリックの実装上、このようなコードを書くことはできません。
public class GenSet<E> {
private E a[];
public GenSet() {
a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
}
}
型安全性を確保しながら実装するにはどうしたらよいでしょうか?
Javaフォーラムで、こんな解決策を見ました。
import java.lang.reflect.Array;
class Stack<T> {
public Stack(Class<T> clazz, int capacity) {
array = (T[])Array.newInstance(clazz, capacity);
}
private final T[] array;
}
でも、本当に何が起こっているのかわからないんです。
どうすればいい?
お返しに質問なんですが、あなたの
GenSet
checked"またはunchecked"ですか?
これはどういう意味ですか?
-
チェック済み : ストロングタイピング .
GenSet
は、それが含むオブジェクトのタイプを明示的に知っています (つまり、そのコンストラクタは、明示的にClass<E>
の型でない引数が渡された場合、メソッドは例外をスローします。E
. 参照Collections.checkedCollection
.->その場合は、こう書いてください。
public class GenSet<E> { private E[] a; public GenSet(Class<E> c, int s) { // Use Array native method to create array // of a type only known at run time @SuppressWarnings("unchecked") final E[] a = (E[]) Array.newInstance(c, s); this.a = a; } E get(int i) { return a[i]; } }
-
チェックなし : 弱いタイピング . 引数として渡されたオブジェクトの型チェックは実際には行われていない。
-その場合、次のように記述します。
public class GenSet<E> { private Object[] a; public GenSet(int s) { a = new Object[s]; } E get(int i) { @SuppressWarnings("unchecked") final E e = (E) a[i]; return e; } }
なお、配列のコンポーネントタイプは 消去 の型パラメータを指定します。
public class GenSet<E extends Foo> { // E has an upper bound of Foo private Foo[] a; // E erases to Foo, so use Foo[] public GenSet(int s) { a = new Foo[s]; } ... }
消去法で実装されているため、quot;generic" クラスは実行時にどの型引数で生成されたかを知らないので、何らかの明示的なメカニズム(型チェック)を実装しない限り型安全性を提供することができないのです。
関連
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
Spring Boot による HTTPS アクセスの設定
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Javaエラーメッセージがenclosingクラスでない
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)