Effective Java second editionを読む-4
Effective Java second edition、ジェネリクスのほうは一通り目を通したが、確実に泥沼にハマってる悪寒・・・
List<String>[] strListAry = null; // 総称配列型の変数を宣言すること自体はOK strListAry = new ArrayList<String>[1]; // この行でコンパイルエラー // -> List<String> の総称配列を作成できません。 strListAry = new List[1]; // コンパイル可能だが警告が出る strListAry = new ArrayList[1]; // コンパイル可能だが警告が出る
総称配列型の変数を宣言するのはOKらしい。
しかし実際に型を指定した配列を生成することはできない。
宣言自体は許されるのはなぜ???
変数宣言もインスタンス生成も両方NGだと思ってたんで混乱。
ついでにこういうメソッドを定義して↓
public <T> List<T>[] getListArray() { // List<T>[] listAry = new List<T>[1]; // これだとNG List<T>[] listAry = new List[1]; // ここで警告 // ->型の安全性: 型 List[] の式は、未検査の型変換を使用して List<T>[] に準拠するようにする必要があります。 listAry[0] = new ArrayList<T>(); return listAry; }
で、下記のように呼んでみると、どのパターンでも警告なしでコンパイルできる。
public void exe() { // 下記のどれでも警告なし List<String>[] strListAry = this.<String>getListArray(); List[] noParam = this.getListArray(); List<String>[] noTypeParam = this.getListArray(); List[] rawListAry = this.<String>getListArray(); }
List