これはjdk1.7.0_04
です。
条件付きで自分の空のリストを作成するのCollections.emptyList()
ではなく、使用しようとしていました。new
List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.emptyList();
ただし、次のエラーが発生します。
error: incompatible types
List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.emptyList();
^
required: List<String>
found: List<CAP#1>
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object
1 error
私は物事を次のように変更する必要があることを理解することができました:
List<String> list = (anArray != null) ? Arrays.asList(anArray) : Collections.<String>emptyList();
しかし、これに取り組んでいる一環として、私は(とにかく)奇妙な状況に遭遇しました:
List<String> alwaysEmpty = Collections.emptyList();
正常にコンパイルされますが、次のようになります。
List<String> alwaysEmpty = (List<String>) Collections.emptyList();
次のコンパイルエラーが発生します。
error: inconvertible types
List<String> alwaysEmpty = (List<String>) Collections.emptyList();
^
required: List<String>
found: List<Object>
一体何?
これで、おそらく何らかの奇妙な理由で、条件演算子を使用すると、型推論システムがemptyList()
呼び出しの型パラメーターを認識できString
ないため、明示的に指定する必要があることがわかります。しかし、なぜ(明らかに冗長な)キャストを挿入すると混乱するのでしょうか?