Arrays.asList()。contains()on Double vs double arrays
我有一个双数组doubleArray1
。 我尝试了一个Arrays.asList().contains()
操作,如下所示
double doubleArray1 [] = {1D,2D,3D}; if(Arrays.asList(doubleArray1).contains(1D)) { System.out.println("hello-1"); }
它不打印任何东西。 然后我把它变成了一个Double数组
Double doubleArray1 [] = {1D,2D,3D}; if(Arrays.asList(doubleArray1).contains(1D)) { System.out.println("hello-1"); }
它打印hello-1
。
有人能解释为什么会有这种差异
你第一次调用Arrays.asList
实际上是返回一个List
– 它是自动装箱参数,因为double[]
不是T[]
…generics不允许原始类型作为类型参数。
如果要将double[]
转换为List
,则需要手动执行或使用第三方库执行此操作。 例如:
public List toList(double[] doubles) { List list = new ArrayList<>(doubles.length); for (double x : doubles) { list.add(x); } return list; }
请注意,与Arrays.asList
不同,对数组的任何后续更改都不会反映在列表中,反之亦然 – 它是副本,而不是视图。
Generic允许使用类型而非基本类型。 因此,在将它与原语进行比较时,它并没有给出你的愿望,但是类型给你结果。
要添加到Jon的答案: asList
采用vararg(变量arity)参数列表,并且vararg参数不会按照人们的预期方式进行自动装箱。 一个不涉及generics的简单案例:
public void foo(Double... x) { whatever } double[] doubleArray1 = {1D,2D,3D}; foo(doubleArray1); // error
给出错误argument type double[] does not conform to vararg element type Double
。 这同样适用于asList
; 这里发生的是,因为Arrays.asList
是通用的,你没有明确地给它generics类型,它会选择任何Arrays.asList
东西; Double
不起作用(出于同样的原因, foo
调用将无法编译), double[]
确实有效。 这个表达式,你明确地给它通用参数,将在编译时给你相同的错误:
Arrays.asList(doubleArray1).contains(1D)