请问您能解释为什么第一个返回类型的代码无法编译?
消息是: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);
}
}
}
答案 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>();
会正常工作。