9

我试图将初始化列表 {...} 传递给构造函数,但它不起作用。当我改为在方法局部变量(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});
    }
}
4

7 回答 7

20

当声明int[]并分配{1, 2, 3}编译器时,编译器知道您想要创建一个int[],因为它在那里被拼写出来。

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

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

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

于 2009-06-19T11:38:41.267 回答
10

{}构造称为数组初始化器,它用于在 Java 中初始化数组。(参考:Section 10.6: Array Initializers from The Java Language Specification, Third Edition。)

传递{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};

以上之所以有效,是因为类型信息是在变量类型声明中提供给编译器的,在本例中为int[]. 上面的意思是:

int[] a = new int[] {1, 2, 3};

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

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

new Quicksort(new int[] {1, 2, 3});  // This will work.
于 2009-06-19T11:51:20.210 回答
4

这可能是因为您的初始化列表没有输入信息。试试这个:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
于 2009-06-19T11:38:49.457 回答
4

你也可以这样做:

public class QuickSort {
    int[] a;

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

    public static void main(String[] args) {

        QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
    }
}
于 2009-06-19T11:50:12.630 回答
2

Java 并没有真正的类型推断。数组变量声明是 Java 语言规范中的一种特殊情况,不适用于方法参数。这样做是可能的,但会给规范增加很多复杂性,因为它必须处理诸如 {"a", "b"} 是否创建 String[] 或 Object[] 之类的问题 - 在这里看起来很明显,但是如果它是复杂类型层次结构中的对象呢?如果方法被重载并且两个版本都存在怎么办?

于 2009-06-19T11:46:18.910 回答
0

花括号(在数组文字中使用时)只能在声明数组时使用:)

于 2009-06-19T11:56:54.880 回答
-1

在将列表传递给构造函数之前,您是否尝试过将列表转换为 int[] ?

于 2009-06-19T11:37:49.940 回答