我可以像这样设置一个数组:
Object[] objects = {new Object()};
但是,如果我有一个方法:
public void setObject(Object[] objects) {
}
我不能执行以下操作:
setObject({new Object()});
为什么是这样?为什么{new Object()}
不足以作为参数但足以初始化Object[]
数组?
我可以像这样设置一个数组:
Object[] objects = {new Object()};
但是,如果我有一个方法:
public void setObject(Object[] objects) {
}
我不能执行以下操作:
setObject({new Object()});
为什么是这样?为什么{new Object()}
不足以作为参数但足以初始化Object[]
数组?
您可以传递一个匿名数组:
setObject(new Object[] { new Object() });
请注意,该语法{ new Object() }
仅在其声明中初始化数组时才有效。例如:
Object[] arr = { new Object() };
这在声明数组后不起作用:
Object[] arr;
//uncomment below line and you'll get a compiler error
//arr = { new Object() };
arr = new Object[] { new Object() };
因为你还没有输入数组。它可以是对象、整数等。
以下应该有效:
setObject(new Object[]{new Object()});
每个 Java 数组都有一个组件类型。在初始化器中使用时,编译器会推断出新数组的类型(右侧)与声明的类型(左侧)相同。
当声明丢失时,编译器不知道数组的组件类型应该是什么。你必须是明确的,使用表达式setObject(new Object[] { new Object() })
有人可能想知道为什么编译器不从方法参数的声明类型推断类型,就像初始化变量时那样。但是,编译器根据参数类型解析要调用的方法;如果你不知道你正在调用的方法,你就不能从它的参数类型中推断出任何东西。初始化变量时没有循环。
正确的回调是:
setObject(new Object[]{new Object()});