Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么将{a,b,c}传递给一个方法不';不行?_Java_Arrays_Syntax_Array Initialization - Fatal编程技术网

Java 为什么将{a,b,c}传递给一个方法不';不行?

Java 为什么将{a,b,c}传递给一个方法不';不行?,java,arrays,syntax,array-initialization,Java,Arrays,Syntax,Array Initialization,我试图将初始化列表{…}传递给构造函数,但没有成功。 当我在方法局部变量(int[])中声明它时,它工作得非常完美 为什么呢 public class QuickSort { int[] a; public QuickSort(int[] a) { this.a = a; } public static void main(String[] args) { // ################### // ##

我试图将初始化列表{…}传递给构造函数,但没有成功。 当我在方法局部变量(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[]呢?

当声明
int[]
并赋值
{1,2,3}
时,编译器知道您想要创建一个
int[]
,正如前面所述

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

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

告诉编译器数组是什么。

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

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

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

您也可以这样做:

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中初始化数组。(参考:来源)

传递
{1,2,3}
本身无效的原因是没有与初始值设定项关联的类型信息

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

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

  • 新字符串[]{“你好,世界”}
  • 新字符[]{'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};
现在,如果我们有
newint[]{1,2,3}
,我们就可以创建一个新的
int[]
数组,这样就可以像处理任何其他
int[]
数组一样处理它——只是它没有与之关联的变量名

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

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

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

事实上,varargs语言特性(如java.util.Arrays.asList)本来就是要这样做的。更改它可能是一个错误……非常好!我将使用它。