あなたはあなたのジェネリックを混乱させています。あなたがしたいことをする方法は
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<>();