路过为什么{A,B,C}的方法不起作用?(Why passing {a, b, c} to a me

2019-06-23 16:43发布

我试图初始化列表{...}传递给一个构造函数和它没有工作。 当我代替的方法局部变量声明它(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});
    }
}

Answer 1:

当声明int[]和分配{1, 2, 3}编译器知道你想创建一个int[]因为它的拼写在那里。

在您的贴在数组的方法后一种情况叫你将不得不使用

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

告诉编译器你的阵列是什么。



Answer 2:

{}构建体被称为数组初始化,并且用于初始化在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};

之所以上述有效是因为类型信息在可变类型声明,在此情况下被提供给编译器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.


Answer 3:

这可能是因为你的初始化列表中没有键入的信息吧。 试试这个:

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


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


Answer 5:

Java并没有真正有类型推断。 数组变量声明是一个特殊情况,在Java语言规范,一个并不适用于方法的参数。 这样做将是可能的,但将大量的复杂性增加了规范,因为它必须处理的问题,如是否{“A”,“B”}创建一个String []或Object [] - 在这里看起来很明显,但如果它是在一个复杂的类型层次的对象? 而如果该方法重载,这两个版本的存在吗?



Answer 6:

大括号(在数组文本使用时)声明所述阵列时仅可用于:)



Answer 7:

您是否尝试过铸造名单将它传递给构造函数之前为int []?



文章来源: Why passing {a, b, c} to a method doesn't work?