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