こんなプログラムを作成してみました。 NGと書いてある行はコンパイルエラーになります。 OKと書いてある行でも、※x と書いてあるところはその警告が出ます。
package test3;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Main> list = new ArrayList<Main>(); // OK
List<Main>[] lists1 = new ArrayList<Main>[5]; // NG ※1
List<Main>[] lists2 = new List<Main>[5]; // NG ※2
List[] lists3 = new ArrayList[5]; // OK ※3
List[] lists4 = new List[5]; // OK ※4
List<Main>[] lists5 = new ArrayList[5]; // OK ※5
List<Main>[] lists6 = new List[5]; // OK ※6
MainList[] list7 = new MainList[5]; // OK
}
}
class MainList extends ArrayList<Main> {
}
/*
* ※1 ArrayList<Main>の総称配列を作成できません
* ※2 List<Main>の総称配列を作成できません
* ※3 List は raw 型です。総称型 List<E> への参照は、パラメーター化する必要があります
* ※4 List は raw 型です。総称型 List<E> への参照は、パラメーター化する必要があります
* ※5 型の安全性: 型 ArrayList[] の式は、未検査の型変換を使用して List<Main>[] に準拠するようにする必要があります
* ※6 型の安全性: 型 List[] の式は、未検査の型変換を使用して List<Main>[] に準拠するようにする必要があります
*/
「総称配列」というのは要するに型パラメータが付いているクラスの配列、ってことですね。
結局のところ、どう頑張っても警告は出てしまいます。「型パラメータ付きリストの配列」なんて使っちゃいけないってところでしょうかね。
リストを複数格納可能なクラスを用意して使用するか、Mapを使用するか。
どうしても警告が出ないようにListの配列を使いたい場合は一番最後の例のように、型パラメータ付きArrayListの派生クラスを作って使用するしかないですが、あまりエレガントとは言えないですね。