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

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

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

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

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

因此,必须通过编写new Type[]让编译器知道数组的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 []?