【问题标题】:Arrays.asList().contains() on Double vs double arrays [duplicate]Double vs double 数组上的 Arrays.asList().contains() [重复]
【发布时间】:2014-01-14 17:56:15
【问题描述】:

我有一个双数组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

有人能解释一下为什么会有这种差异吗?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    您对Arrays.asList 的第一次调用实际上返回了List<double[]> - 它正在自动装箱参数,因为double[] 不是T[]...泛型不允许将原始类型作为类型参数。

    如果您想将double[] 转换为List<Double>,您要么需要手动完成,要么使用第三方库来完成。例如:

    public List<Double> toList(double[] doubles) {
        List<Double> list = new ArrayList<>(doubles.length);
        for (double x : doubles) {
            list.add(x);
        }
        return list;
    }
    

    请注意,与Arrays.asList 不同,对数组的任何后续更改不会反映在列表中,反之亦然 - 它是副本,而不是视图。

    【讨论】:

      【解决方案2】:

      Generic 允许使用类类型而不是原始类型。因此,在将其与原语进行比较时,它不会给您期望的输出,但类类型会为您提供结果。

      【讨论】:

        【解决方案3】:

        补充 Jon 的答案:asList 采用 vararg(可变数量)参数列表,并且 vararg 参数不会按照人们期望的方式自动装箱。一个不涉及泛型的简单案例:

        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 是泛型的,并且您没有明确地给它泛型类型,它会选择任何有效的; Double 不起作用(出于同样的原因,foo 调用不会编译),而 double[] 确实起作用。这个表达式,你明确地给它泛型参数,会在编译时给你同样的错误:

        Arrays.<Double>asList(doubleArray1).contains(1D)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-23
          • 2014-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多