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[] listAry = new List[1]; だと警告が出たのに、メソッドの戻り値として受け取る時は警告が出ない。これもよくわからん。