JMemo032

型パラメータ付きリストの配列

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

最終更新:2013年02月05日 11:29