用于填充不同列表的三元运算符 - 编译器错误

bje*_*ski 3 java generics compiler-errors

当我尝试使用三元运算符来选择要添加到哪个数组列表时:

List<String> a = new ArrayList<>();
List<String> b = new ArrayList<>();

(true ? a : b).add("test");
Run Code Online (Sandbox Code Playgroud)

当我尝试在三元运算符中启动列表时:

List<String> a = new ArrayList<>();

(true ? a : new ArrayList<>()).add("test");
Run Code Online (Sandbox Code Playgroud)

它不适用于错误:

类型List中的方法add(capture#1-of?extends Object)不适用于参数(String)

我不明白为什么这不合法.虽然没有意义,但以下工作正常:

(new ArrayList<>()).add("test");
Run Code Online (Sandbox Code Playgroud)

我想更好地理解Java编译器及其工作原理,这就是我提出这个问题的原因.我明白这不太实际.

编辑:

我想要理解的关键是为什么它不能在三元组中起作用,但它本身可以正常工作.

Men*_*ena 6

那是因为钻石符号(new ArrayList<>)使用了你的引用(List<String>)的类型推断.

请参阅此处的 Oracle文档.

但是在第二种情况下,编译器不能/不设计从三元条件的另一个术语(a参考)推断泛型类型.

您可以使用以下成语来修复它,并使用明确的泛型参数:

(true ? a : new ArrayList<String>()).add("test");
Run Code Online (Sandbox Code Playgroud)