当我执行下面的代码时,它没有任何问题。
List<String> singletonList = Collections.singletonList("Hello");
List<String> s = Collections.emptyList();
singletonList.addAll(s);
但是,当我尝试执行以下操作时,会给出编译错误。为什么呢?
List<String> singletonList = Collections.singletonList("Hello");
singletonList.addAll(List<String> Collections.emptyList());
Collections.emptyList是一种创建空列表的类型安全方法。但是为什么我的程序不能编译呢?我知道我不能添加到不可变列表(UnsupportedOperationException
)但允许添加空列表。实际上我正在测试这个,我注意到了上面的事情。
答案 0 :(得分:4)
Collections.emptyList()
会返回List<Object>
,而List<String>
与singletonList.addAll(Collections.<String>emptyList());
没有任何关系,因此不允许投射。
您需要的是:
{{1}}
答案 1 :(得分:2)
在Java 8中,改进了类型推断。你可以做到
List<String> singletonList = Collections.singletonList("Hello");
singletonList.addAll(Collections.emptyList());
调用emptyList()
的类型参数将从其使用的上下文中推断出来,即。它期望Collection<? extends String>
。