是否可以使用方法调用上的值初始化`List`

时间:2015-01-21 18:08:42

标签: java list arguments

下面是一个参数类型为List

的方法
 void addToMe(List<String> list)

是否可以像这样传递值

 addToMe(new ArrayList<String>().add("Test Element"));

现在给我错误incompatible types: boolean cannot be converted to List<String>。为什么不允许这样做?

4 个答案:

答案 0 :(得分:0)

您无法执行addToMe(new ArrayList<String>().add("Test Element"));的原因是因为add(E)不适用于fluent样式编程:returns a boolean,而不是具有添加元素的原始列表

选项1:具有初始化程序块*

的匿名类型
new ArrayList<String>(){{ add("Test Element"); }}

在您的代码中:

void addToMe(new ArrayList<String>(){{ add("Test Element"); }})

这是读取+写入,仍然是List<String>,因此您可以毫无问题地对待它(警告:对此有微妙的后果,因为{{返回的类型该列表上的1}}现在不是getClass(),而是匿名类类型。)

选项2:使用(危险)java.util.ArrayList

或者,如果您只需要Arrays.asList(String... args),并且不需要可写,则可以使用Arrays#asList。但是:小心。这是固定大小列表。向其添加更多项目将引发List<String>

UnsupportedOperationException

选项3:使用JCF“复制”构造函数

在JCF的void addToMe(Arrays.asList("Test Element1", "Test Element2")); the documentation中,它声明:

  

所有通用Collection实现类......应该提供一个构造函数,其中包含一个类型为Collection的参数,它创建一个与其参数具有相同元素的新集合。

因此,如果您将其与Collection<E>一起使用,则可以执行以下操作:

Arrays.asList(String... args)

但这很丑陋且难以阅读,因此我建议将其拆分为多行。仅仅使用 void addToMe(new ArrayList<String>(Arrays.asList("Test Element1", "Test Element2"))); 的优点是它是读取+写入而不是固定大小。

答案 1 :(得分:0)

  

addToMe(new ArrayList()。add(&#34; Test Element&#34;));

.add()的{​​{1}}方法继承自List,根据定义,它不会返回Collection本身,而是返回Collection;因此,这无法奏效。

但是,你可以这样做:

boolean

Java编译器永远不会自动化#34;走方法调用链并推断出你的意图;它很漂亮&#34; dumb&#34;。

但另一方面,每个人都有不同的意图;这就是为什么语言有规则...而且语言太过自由了#34;通常很难读。

作为Java核心规范编写者之一曾经说过:&#34;你只编写一次代码;你多次阅读&#34;。

答案 2 :(得分:-1)

你打电话给&#34;添加(元素)&#34;成功时返回true,失败时返回false。它是一个布尔函数。相反,使用:

addToMe(new ArrayList<String>(new String[]{"Test Element"}));

答案 3 :(得分:-1)

您正在将boolean传递给您的函数,因为这是List.add()返回的内容。您可以在此处查看List.add()的Java文档:

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)