为什么,如果你有,比方说,这些功能:
void func1(Object o){
//some code
}
void func1(Object[] o){
//some code
}
您可以致电,例如:
func1("ABC");
但不:
func1({"ABC", "DEF"}); // instead having to write:
func1(new Object[]{"ABC", "DEF"});
问题:为什么需要在数组上调用构造函数有什么特殊原因吗?
答案 0 :(得分:5)
"array initialiser"仅适用于声明/作业:
Object[] o = { 1, 2 };
或"array creation expressions":
new Object[] { 1, 2 };
不适用于方法调用:
// Doesn't work:
func1({1, 2});
它的方式......你可以在JLS, chapter 10.6. Array Initializers中阅读它。提取物:
可以在声明(§8.3,§9.3,§14.4)中指定数组初始值设定项,或者作为数组创建表达式(§15.10)的一部分来创建数组初始值设定项一个数组并提供一些初始值。
除了现在没有在JLS中定义之外,似乎没有理由认为未来的Java版本不允许在其他上下文中使用数组初始化器/数组文字。数组类型可以从使用数组文字的上下文或包含的变量初始化器推断
当然,你可以声明func1
有一个varargs参数。但是,你应该小心重载它,因为这可能会导致在呼叫现场的一些混乱
答案 1 :(得分:5)
有人建议Java SE 5.0将使用数组文字表示法。不幸的是,我们得到了varargs,带来了所有的乐趣。
所以要回答为什么这样的问题,语言就是这样。您可能会在更高版本的Java中看到列表文字。
答案 2 :(得分:1)
您正在尝试执行Java尚不支持的内联数组初始化。
我认为如果你愿意,你可以使用varargs实现所需的结果,但是如果你需要将一个数组传递给一个方法,你必须按照Java喜欢的方式初始化它。