为什么将{a,b,c}传递给方法不起作用?

Max*_*ler 9 java arrays syntax array-initialization

我试图将初始化列表{...}传递给构造函数,但它不起作用.当我在一个方法局部变量(int [])中声明它时,它可以完美地工作.

这是为什么?

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*oey 20

声明int[]和分配{1, 2, 3}编译器时,知道你想创建一个int[]正如它所拼写的那样.

在后一种情况下,您将数组直接粘贴到方法调用中,您必须使用

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
Run Code Online (Sandbox Code Playgroud)

告诉编译器你的数组是什么.


coo*_*ird 10

{}构造称为数组初始化程序,它用于在Java中初始化数组.(参考:10.6节:数组的初始化Java语言规范,第三版).

传递{1, 2, 3}自身无效的原因是因为没有与初始化程序关联的类型信息.

因此,必须让编译器知道数组的类型是通过写入new Type[],其中Type是为其创建数组的类型.

以下是数组初始值设定项的所有有效用法:

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

可以看出,这种表示法可以用于许多数据类型,因此它不是特定于整数的东西.

至于:

int[] a = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

上述有效的原因是因为类型信息是在变量类型声明中提供给编译器的,在本例中是int[].以上含义如下:

int[] a = new int[] {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

现在,如果有的话new int[] {1, 2, 3},我们可以int[]在适当的位置创建一个新的数组,这样就可以像任何其他int[]数组一样处理它 - 只是它没有与之关联的变量名.

因此,new int[] {1, 2, 3}可以将创建的数组发送到int[]以其参数为参数的方法或构造函数中:

new Quicksort(new int[] {1, 2, 3});  // This will work.
Run Code Online (Sandbox Code Playgroud)