Collections.emptyList()的难题

时间:2012-05-25 12:33:23

标签: java generics collections

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!

3 个答案:

答案 0 :(得分:7)

试试这个:

List<Integer> i = j > 0 ? Collections.<Integer>emptyList() : new ArrayList<Integer>(); 

答案 1 :(得分:2)

在第一个示例中,您不允许Java捕获<T>中的public static <T> List<T> Collections.emptyList(),因为您没有直接将其分配给var。 Java的类型推断非常弱,无法通过条件运算符进行查看。在第二个示例中,您可以直截了当地将T成功捕获到Integer

答案 2 :(得分:0)

第二个工作的原因是编译器能够从存储结果的变量类型中找出所需的确切类型。在第一种情况下,OTOH Java的类型计算功能不够强大