8

为什么

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

编译得很好,但是对于

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

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

4

2 回答 2

15

您需要注意空列表的类型安全

所以像这样返回字符串的空列表

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

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

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

于 2013-05-28T06:07:27.123 回答
2

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

我不想提取这一章,但它在Java Puzzlers的第 8 章 Dos Equis 中有很好的解释。如果可以的话,买一份,真的很值得。

于 2013-05-28T09:53:24.777 回答