我已经试图通过一个初始清单{...}为一种构造它没有工作。当我而不是宣布它在一个方法的局部变量(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});
    }
}
有帮助吗?

解决方案

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

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

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

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

其他提示

{} 建构称为一系列初始化程序,并用于一系列初始化。(参考: 第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};

为什么上面是有效的,是因为类型的信息提供给编译器在变型宣言》,该宣言在这种情况下是 int[].什么,上述的暗示如下:

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

现在,如果我们有 new int[] {1, 2, 3}, 我们能够创建一个新的 int[] 阵列,以便可以处理任何其他 int[] 阵列会--这只是它没有一个变量名称与它相关联。

因此,列创造的 new int[] {1, 2, 3} 可以送到一个方法或构造,需要一个 int[] 作为其论点:

new Quicksort(new int[] {1, 2, 3});  // This will work.

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

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

您也可以这样做:

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

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

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

您是否尝试将列表转换为int [],然后再将其传递给构造函数?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top