のを初期化するにはどうすればよいArray
ですArrayList<String>
か?
この構文を試しましたが、うまくいきませんでした:
ArrayList<String>[] subsection = new ArrayList<String>[4];
のを初期化するにはどうすればよいArray
ですArrayList<String>
か?
この構文を試しましたが、うまくいきませんでした:
ArrayList<String>[] subsection = new ArrayList<String>[4];
あなたはこのように定義することができます:
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
lists[0] = new ArrayList<String>();
lists[0].add("Hello");
lists[0].add("World");
String str1 = lists[0].get(0);
String str2 = lists[0].get(1);
System.out.println(str1 + " " + str2);
その構文は、非ジェネリックに対して正常に機能しますArrayList
。(イデオン)
しかし、ジェネリックでは機能しませんArrayList<E>
: (ideone)
このコード:
ArrayList<String>[] subsection = new ArrayList<String>[4];
コンパイラ エラーが発生します。
Main.java:8: 汎用配列の作成 ArrayList<String>[] subsection = new ArrayList<String>[4];
汎用バージョンの場合、次を使用しますArrayList<ArrayList<E>>
。
ArrayList<ArrayList<String>> subsection = new ArrayList<ArrayList<String>>();
コメントの後、わかりました、よく考えました...あなたの権利です。
理解した。
ArrayList[] test = new ArrayList[4];
test[3] = new ArrayList<String>();
test[3].add("HI");
System.out.println(test[3].get(0));
正直に言うと、なぜこれが機能するのかよくわかりません。
test の最初のアイテムを新しい Collection として割り当てると、配列内の他のすべてのアイテムのみがそのタイプになることが許可されます。だからあなたはできなかった
test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();
ジェネリックスを型の明確化プロセスとして調べてください。型付きの値をraw型の変数に割り当てることができ、その逆も可能です。コアジェネリックでは、プログラマーが型キャストをやりすぎないようにするためのショートカットです。これは、コンパイル時にいくつかの論理エラーをキャッチするのにも役立ちます。非常に基本的に、ArrayListには常にObject型のアイテムが暗黙的に含まれます。
それで
test[i] = new ArrayList<String>(); because test[i] has type of ArrayList.
ビット
test[3] = new ArrayList<String>();
test[2] = new HashSet<String>();
HashSetは単にArrayListのサブクラスではないため、期待どおりに機能しませんでした。ジェネリックはここでは何の関係もありません。ジェネリックを取り除くと、明らかな理由がわかります。
でも、
test[2] = new ArrayList<String>();
test[3] = new ArrayList<HashSet>();
両方のアイテムがArrayListsであるため、うまく機能します。
これが理にかなっていることを願っています...