泛型:无法从Collections.emptyList()转换为List <string> </string>

时间:2013-05-28 05:59:59

标签: java generics collections empty-list

为什么

public List<String> getList(){
    if (isMyListOKReady())
        return myList;
    return Collections.emptyList();
}

编译好,但是

public List<String> getList(){
    return isMyListReady() ? myList : Collections.emptyList();
}

Eclipse说"Type mismatch: cannot convert from List<Object> to List<String>"

2 个答案:

答案 0 :(得分:14)

您需要处理空列表的类型安全

所以返回像这样的

字符串的空列表
public List<String> getList(){
    return isMyListReady() ? myList : Collections.<String>emptyList();
}

更具体地说,看看你的功能是返回List<String>。因此,当您使用三元运算符时,您的条件也应该返回List<String>

但是在Collections.emptyList()的情况下,它的类型不是List<String>。所以只需要指定空集合的类型。所以只需使用Collections.<String>emptyList()

答案 1 :(得分:1)

类型不匹配的原因非常模糊,隐藏在条件表达式的逻辑中。简而言之,Java将尝试通过查看第二个和第三个操作数的类型来确定表达式的结果类型,可能导致隐藏的强制转换或基元的二进制升级!如果您将每个变量提取到具有原始类型的本地变量中,然后再次查看您的条件,则可以更清楚。

我不想提取这一章,但在Java Puzzlers第8章Dos Equis中对此进行了详细解释。如果可以,请获取它的副本,这非常值得。