我有这个:
import java.util.Arrays;
import java.util.ArrayList;
public class Test1 {
public static void main(String[] args) {
double[] a = new double[2];
for( double d : Arrays.asList(a))
System.out.println(d);
}
}
输出:
$ javac Test1.java
Test1.java:9: error: incompatible types
for( double d : Arrays.asList(a))
^
required: double
found: double[]
1 error
为什么我在这里收到错误?
和
错误是什么意思?它告诉我什么?
答案 0 :(得分:4)
在Java中,List
之类的集合只能引用引用类型。 double[]
是一个基元数组(但数组本身是一个引用类型)。因此,Arrays.asList
正在尝试创建List<double[]>
,如果您尝试在该列表上执行for-each,那么您将获得double[]
数组而非单独double
的项目1}}值。
但是,您仍然可以在原始数组上使用for-each循环:
for (double d : a) {
System.out.println(d);
}
答案 1 :(得分:2)
您在此处收到错误,因为当您使用接受varargs的函数时,此函数会在场景后面创建一个新的对象数组。因此,Arrays.asList(1,2,3)
实际上是一个整数数组
传入整数数组时,Arrays.asList()
会在场景后面创建一组整数数组。这就是为什么你可以通过以下循环迭代它:
for( double d : Arrays.asList(a))
尝试改变它:
for(double[] d : Arrays.asList(a))
并且您会发现d
实际上是对您传递到Arrays.asList()
- a
的数组的引用。
答案 2 :(得分:2)
变量a
的类型为double[]
,而不是double
。
因此,调用Arrays.asList(a)
会生成List<double[]>
,而不是List<double>
。换句话说,列表中的每个元素都是double
值的数组,而不是double
值。
因此,迭代这样的列表不会提取示例数组double
中的2 a
值,而是提取单个double[]
值,即数组a
本身
通过运行以下语句可以轻松验证:
a = new double[2];
b = Arrays.asList(a);
System.out.println(b.size());
以上代码将打印1
,验证b
是仅包含1个元素的列表,数组a
。
要迭代a
本身的元素,可以直接运行
for (double d : a) {
System.out.println(d);
}
要创建a
中所有双精度值的列表,在添加到列表之前,每个值都必须转换为Double
对象,例如:
List<Double> c = new ArrayList<Double>();
for (double d : a) {
c.add(d); // Java automatically converts from double to Double
}