是否可以在方法调用时用值初始化 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".
下面是一个参数类型为 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".