5
int j = 0; 
List<Integer> i = j > 0 ? Collections.emptyList() : new ArrayList<Integer>(); // compiler error:cannot convert from List<capture#1-of ? extends Object> to List<Integer>

その間、

List<Integer> li = Collections.emptyList(); // it works

型消去は知っていますが、コンパイルに失敗した理由はわかりません!

ヘルプ、thx!

4

3 に答える 3

7

これを試して:

List<Integer> i = j > 0 ? Collections.<Integer>emptyList() : new ArrayList<Integer>(); 
于 2012-05-25T12:35:55.643 に答える
2

最初の例では、Javaを変数に直接割り当てていないため、Javaが<T>inをキャプチャすることを許可していません。public static <T> List<T> Collections.emptyList()Javaの型推論は非常に弱く、条件演算子を通して見ることができません。2番目の例では、単純な状況にあり、Tに正常にキャプチャされてIntegerいます。

于 2012-05-25T12:41:13.033 に答える
0

2番目が機能する理由は、コンパイラーが、結果が格納されている変数の型から必要な正確な型を判別できるためです。OTOH Javaの型計算は、最初のケースで同じことを行うほど強力ではありません

于 2012-05-25T12:41:13.193 に答える