Java 为什么将{a,b,c}传递给一个方法不';不行?
我试图将初始化列表{…}传递给构造函数,但没有成功。 当我在方法局部变量(int[])中声明它时,它工作得非常完美 为什么呢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) { // ################### // ##
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)本来就是要这样做的。更改它可能是一个错误……非常好!我将使用它。