こんなプログラムを作成してみました。 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の派生クラスを作って使用するしかないですが、あまりエレガントとは言えないですね。