Java对象数组的好奇心

时间:2012-09-17 12:02:18

标签: java

为什么,如果你有,比方说,这些功能:

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"});

问题:为什么需要在数组上调用构造函数有什么特殊原因吗?

3 个答案:

答案 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喜欢的方式初始化它。