下面是一个参数类型为List
void addToMe(List<String> list)
是否可以像这样传递值
addToMe(new ArrayList<String>().add("Test Element"));
现在给我错误incompatible types: boolean cannot be converted to List<String>
。为什么不允许这样做?
答案 0 :(得分:0)
您无法执行addToMe(new ArrayList<String>().add("Test Element"));
的原因是因为add(E)
不适用于fluent样式编程:returns a boolean
,而不是具有添加元素的原始列表
new ArrayList<String>(){{ add("Test Element"); }}
在您的代码中:
void addToMe(new ArrayList<String>(){{ add("Test Element"); }})
这是读取+写入,仍然是List<String>
,因此您可以毫无问题地对待它(警告:对此有微妙的后果,因为{{返回的类型该列表上的1}}现在不是getClass()
,而是匿名类类型。)
java.util.ArrayList
或者,如果您只需要Arrays.asList(String... args)
,并且不需要可写,则可以使用Arrays#asList
。但是:小心。这是固定大小列表。向其添加更多项目将引发List<String>
:
UnsupportedOperationException
在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)