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编译器及其工作原理,这就是我提出这个问题的原因.我明白这不太实际.
编辑:
我想要理解的关键是为什么它不能在三元组中起作用,但它本身可以正常工作.
那是因为钻石符号(new ArrayList<>
)使用了你的引用(List<String>
)的类型推断.
请参阅此处的 Oracle文档.
但是在第二种情况下,编译器不能/不设计从三元条件的另一个术语(a
参考)推断泛型类型.
您可以使用以下成语来修复它,并使用明确的泛型参数:
(true ? a : new ArrayList<String>()).add("test");
Run Code Online (Sandbox Code Playgroud)