为什么穿{a、b、c}一个方法不工作吗?
-
06-07-2019 - |
题
我已经试图通过一个初始清单{...}为一种构造它没有工作。当我而不是宣布它在一个方法的局部变量(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 [],然后再将其传递给构造函数?