是否可以在方法调用时用值初始化 List

Is it possible to initialize `List` with a value on method call

下面是一个参数类型为 List

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

是否可以像这样传递值

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

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

您对 "add(Element)" 的调用 returns 成功时为真,失败时为假。这是一个布尔函数。相反,使用:

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

你不能做 addToMe(new ArrayList<String>().add("Test Element")); 的原因是因为 add(E) 不是为 fluent style programming: it returns a boolean 设计的,而不是添加元素的原始列表。

选项 1:带有初始化块的匿名类型*

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

在您的代码中:

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

这是 read+write 并且仍然是 List<String> 所以你可以毫无问题地这样对待它,(警告:这会有微妙的后果,因为getClass() 在该列表中返回的类型现在不会是 java.util.ArrayList,而是匿名的 class 类型)。

选项 2:使用(危险)Arrays.asList(String... args)

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

void addToMe(Arrays.asList("Test Element1", "Test Element2"));

选项 3:使用 JCF "copy" 构造函数

在 JCF 的 the documentation for Collection<E> 中,它指出:

All general-purpose Collection implementation classes ... should provide ... a constructor with a single argument of type Collection, which creates a new collection with the same elements as its argument.

因此,如果将此与 Arrays.asList(String... args) 一起使用,您可以:

    void addToMe(new ArrayList<String>(Arrays.asList("Test Element1", "Test Element2")));

但这很难看且难以阅读,因此我建议将其分成多行。与仅使用 Arrays.asList 相比的优势在于它是读+写而不是固定大小。

您将 boolean 传递给您的函数,因为那是 List.add() returns。您可以在此处查看 List.add() 的 Java 文档:

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

addToMe(new ArrayList().add("Test Element"));

List.add()方法继承自Collection,根据定义它不是returnCollection本身,而是boolean;因此这行不通。

但是,您可以这样做:

addToMe(Arrays.asList("Test Element"));

Java 编译器永远不会 "automagically" 遍历方法调用链并推断出您的意图;很漂亮 "dumb".

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

作为 Java 核心规范编写者之一曾说过:"You write code only once; you read it many times".