1

このようにリストのリストを宣言できないのはなぜですか?

List<List<Object>> a = new ArrayList<ArrayList<Object>>();

ArrayList は List 型であるため、上記のコードが有効であると推測しました。

ただし、これは有効です。

List<ArrayList<Object>> b = new ArrayList<ArrayList<Object>>();

内部リストは ArrayList として宣言する必要があります。

誰かがこれを説明できますか?

4

2 に答える 2

2

あなたはあなたのジェネリックを混乱させています。あなたがしたいことをする方法は

List<List<Object>> a = new ArrayList<List<Object>>();

ArrayListジェネリック パラメーター内でを使用することにより、オブジェクトのスコープを からListに絞り込みArrayList、ジェネリック シグネチャを変更します。ジェネリックの外側を使用することArrayListで、準拠したままになります。使用する の実装を指定していListて、それが保持するオブジェクトのタイプが であることがList<Object>、左側の状態とまったく同じです。

これが重要な理由を理解するには、次のリストを検討してください。

// Invalid declaration, but pretend it is valid
List<List<Object>> a = new ArrayList<ArrayList<Object>>();
a.add(new ArrayList<Object>()); // valid
a.add(new LinkedList<Object>()); // not valid because it's not an ArrayList; 
                                 // but according to the left side, it is valid!

もちろん、最善の方法は、Java 7 のダイヤモンド演算子を使用することです。

List<List<Object>> a = new ArrayList<>();
于 2013-09-20T03:13:29.933 に答える
1

これは、一般的なパラメーターの問題であるため、内部リストの問題ではありません。ジェネリック パラメータが同じである限り (つまりArrayList<Object>)、初期化は成功します。それ以外の場合、コンパイラは型の安全性を保証できないため、Java では割り当てを行うことができません。

これが可能であると想像してください:

// Let's pretend this compiles:
List<List<Object>> a = new ArrayList<ArrayList<Object>>();

これで、以下が有効になっている必要があります。

a.add(new LinkedList<Object>());

ただし、オブジェクトはArrayListof であるため、これは無効ArrayListです。そのため、リンクされたリストを挿入することは明らかに無効です。

ただし、これを行うことができます。

List<List<Object>> a = new ArrayList<List<Object>>();

これは、インターフェイスにプログラムするのに十分なはずです。

于 2013-09-20T03:15:01.683 に答える