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

虽然我知道类型擦除,但我不知道编译失败的原因!

帮助,谢谢!

4

3 回答 3

7

尝试这个:

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

在第一个示例中,您不允许 Java 捕获<T>in,public static <T> List<T> Collections.emptyList()因为您没有将其直接分配给 var。Java 的类型推断很弱,无法看穿条件运算符。在第二个示例中,您有一个简单的情况并T成功捕获到Integer.

于 2012-05-25T12:41:13.033 回答
0

第二个起作用的原因是编译器能够从存储结果的变量类型中找出所需的确切类型。OTOH Java 的类型计算功能不足以在第一种情况下做同样的事情

于 2012-05-25T12:41:13.193 回答