Java if三元运算符和Collections.emptyList()

时间:2011-10-12 10:54:26

标签: java generics casting

请问您能解释为什么第一个返回类型的代码无法编译? 消息是:Type mismatch: cannot convert from List<capture#1-of ? extends Object> to List<String>

在第二种情况下是否插入了显式转换?

public class GenericsTest {

        private String getString() {
            return null;
        }

        public List<String> method() {
            String someVariable = getString();
            //first return type
            //return someVariable == null ? Collections.emptyList() : Collections.singletonList(someVariable);
            //second return type
            if (someVariable == null) {
                return Collections.emptyList();
            } else {
                return Collections.singletonList(someVariable);
            }
        }
    }

3 个答案:

答案 0 :(得分:18)

由于类型推断规则。我不知道为什么完全(您应该检查JSL,the ternary operator section),但看起来三元表达式不会从返回类型推断出类型参数。

换句话说,三元表达式的类型取决于其操作数的类型。但其中一个操作数具有未确定的类型参数(Collections.emptyList())。此时,三元表达式仍然没有类型,因此它不会影响类型参数。有两种类型需要推断 - 一种是三元表达式的结果,另一种是.emptyList()方法的类型参数。

使用Collections.<String>emptyList()显式设置类型

答案 1 :(得分:2)

表达式flag ? trueCase : falseCase的类型是两种情况中最常见的类型。

在这种情况下,最常见的Collections.emptyList()Collections.singletonList(someVariable)类型为List<? extends Object>,因为Collections.emptyList()不应该“在将来”看到List<String>应该返回return Collections.emptyList(); 在表达中。


当你这样做时:

{{1}}

编译器可以是智能的,并通过返回类型检测类型并检查正确性(推断)。

答案 2 :(得分:0)

因为Collections.emptyList()没有返回List<String>。您将方法的结果显式设置为List<String>,这意味着您必须返回此类列表。

例如

return Collection<String>.emptyList(); 

return new ArrayList<String>();

会正常工作。