2014-04-17 16 views
1

当我执行下面的代码时,它没有任何问题。添加到空列表

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

阅读答案后,我很想知道你使用的是什么Java版本。 – maxx777

+0

我正在使用JDK7。 – ParagJ

+0

当你收到一个编译错误并且询问一个关于它的问题时,总是在你的问题中包含确切的错误信息 - 这使得它更容易帮助你。 – Jesper

回答

4

Collections.emptyList()返回List<Object>这是不是(没有任何类型的关系)List<String>因此铸造是不允许的。

你需要的是以下几点:

singletonList.addAll(Collections.<String>emptyList()); 
+0

谢谢。你的代码有效。但为什么不允许铸造?我可以写Object o =“abc”; – ParagJ

+1

@ParagJ一个'String'是一个'Object',但是一个'List '不是'List

+1

必须有一个类型关系(父子,父子)才能投入工作。例如'String'是一个'Object'。 –

2

在Java 8中,类型推断得到改善。你可以做

List<String> singletonList = Collections.singletonList("Hello"); 
singletonList.addAll(Collections.emptyList()); 

emptyList()调用类型参数将被使用的情况下,即推断。它期望Collection<? extends String>

+0

+1。这是很好的知道,它已被改进8。 –