1. ホーム
  2. Java

互換性のない型です。ArrayList<ArrayList<Integer>>はList<List<Integer>>に変換できない。

2022-02-07 13:29:39

ArrayList<ArrayList<Integer>>() new list<List<Integer>> オブジェクトを使用しようとすると、このエラーが発生します。


List<List<Integer>> = new ArrayList<ArrayList<Integer>>();



おそらく、2つ目のArrayListをListに変更することでエラーがなくなることがわかると思いますが、その根拠は何でしょうか?


これは、調べた結果、汎用アプリケーションによくある落とし穴です。 

ジェネリック、継承、サブタイプ

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html


1. まず、AがBである場合、AをBに代入することができる。

Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger; // OK

IntegerはObjectを継承しており、そのサブタイプなので、このように代入しても問題はない、汎用的な型です。


2. IntegerはNumberでもあり、DoubleはNumberでもあるので、以下のようなことも可能です。

public void someMethod(Number n) { /* ... */ }

someMethod(new Integer(10)); // OK
someMethod(new Double(10.1)); // OK

ジェネリックも使用可能です。

Box<Number> box = new Box<Number>();
box.add(new Integer(10)); // OK
box.add(new Double(10.1)); // OK




3. 以下はそのハイライトです。

public void boxTest(Box<Number> n) { /* ... */ }

その場合、Box<Integer> や Box<Double> を渡すことができるのでしょうか?

答えは「いいえ」です。

IntegerはNumberのサブクラスです。 DoubleもNumberのサブクラスですが Box<Integer>および  Box<Double> は Box<Integer> のサブクラスではなく、並列に配置され、どちらも Object のサブクラスである。

<スパン <スパン <スパン

<スパン <スパン <スパン