29

Java で、次のコード行が機能しないのはなぜですか?

List<List<String>> myList = new ArrayList<ArrayList<String>>();

に変更すると機能します

List<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();

最初は、インターフェイスのリストを作成できないのではないかと思いましたが、問題なく作成できますList<Runnable>

アイデア?

4

6 に答える 6

45

ジェネリック型はよりペダンティックです。

ListListまたは任意のサブタイプを意味しますが、<List>のみを意味しListます。サブタイプが必要な場合は、<? extends List>

私はあなたが使用できると思います

List<List<String>> myList = new ArrayList<List<String>>();

これを行うことができない理由は、参照への参照を使用することができ、注意が必要な余分なレベルの間接性があるためです。

// with one level of indirection its simple.
ArrayList alist = new ArrayList();
List list = aList; // all good
list = new LinkedList(); // alist is still good.

ジェネリックを使用すると、問題を引き起こす可能性のある 2 つのレベルの間接性を持つことができるため、これらの問題を回避するために、より知識を深めることができます。

// with two levels of indirection
List<ArrayList> alist = new ArrayList<ArrayList>();
List<List> list = (List) alist; // gives you a warning.
list.add(new LinkedList()); // adding a LinkedList into a list of ArrayList!!
System.out.println(alist.get(0)); // runtime error

版画

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList
     cannot be cast to java.util.ArrayList
于 2012-10-12T14:58:01.597 に答える
10

これから始めましょう:

    ArrayList<ArrayList<String>> myList = new ArrayList<ArrayList<String>>();

これは、要素がArrayListsであるArrayListを作成しています。

今、それをに割り当てることができると仮定します

    List<List<String>> myList2 = myList.

これで、次のことができるようになります。

    myList2.add(new LinkedList<String>());

ただし、これは、要素がArrayListsであると想定されるリストにLinkedListを追加したことを意味します。おっと!!!

myList実際には、 toの割り当てはmyList2合法ではありません...そしてそれはオブジェクトに間違った種類を追加することが不可能であることを保証しList<String>ますArrayList<ArrayList<String>>。(ピーターはいません、それは単なる衒学者ではありません:-))

于 2012-10-12T15:01:29.597 に答える
3

実装クラスとして宣言できるのは最上位のコレクションのみですが、ネストされたコレクションは、実際にインスタンスを作成するまでインターフェイスのままにする必要があります。

List<List<String>> rootList = new ArrayList<List<String>>(); 

次に、入力する要素を作成するときに、それを実装にします。

List<String> nodeList = new ArrayList<String>();
rootList.add(nodeList);
于 2012-10-12T15:02:42.147 に答える
1

Type左(宣言)側Typeから右(インスタンス化)側への比較。左では、あなたのタイプはList<String>右にあります、それはArrayList<String>です。違いについて文句を言う場合。

右側(インスタンス)をリストとして更新してください。

   List<List<String>> myList = new ArrayList<List<String>>();

これは正常に機能するはずです。

于 2012-10-12T15:02:01.480 に答える
0

これは古い質問であることは知っていますが、私の考えを共有したかっただけです。

List の List を作成する代わりに、個人的には Type[] ( ) の List を作成し、Type ( )List<Type[]> listArray = new ArrayList<Type[]>();だけの別の List を生成します。このようにすると、混乱を招く List of Lists 構文よりも明確で読みやすくなります。List<Type> list = new ArrayList<Type>();.add(list.toArray())

たとえば、最近のプロジェクトでは、「0」のみの各行が元の新しい行を意味する入力ファイルがありました (これは暗号化アルゴリズムでした)。

String[] input = getInputContents(inFile);
List<String> currentBuffer = new ArrayList<String>();
List<String[]> buffers = new ArrayList<String[]>();

for(String line : input) {
    if(line.equals("0")) {
        buffers.add((String[])currentBuffer.toArray());
        currentBuffer = new ArrayList<String>();
    } else {
        currentBuffer.add(line);
    }
}
于 2016-02-10T14:26:00.290 に答える