如何将双精度值添加到整数数组列表中?(爪哇)

2022-09-03 13:38:33

我试图理解如何将值转换为.是 的,并且它的值为 。DoubleArrayListIntegernumListArrayListIntegerDouble

这是代码:

package bounded.wildcards;

import java.util.ArrayList;
import java.util.List;

public class GenericsDemo {

    public static void main(String[] args) {
        // Invariance Workaround
        List<Integer> numList = new ArrayList<>();
        GenericsDemo.invarianceWorkaround(numList);
        System.out.println(numList);
    }

    static <T extends Number> void invarianceWorkaround(List<T> list) {

        T element = (T) new Double(23.3);  
        list.add(element);
    }

}

这将编译并运行而不会出现错误。


答案 1

这是因为类型擦除与 Java 泛型一起使用 - 类型检查仅在编译时对泛型类型执行,然后擦除泛型的类型信息,从而有效地转换为 。List<Integer>List<Object>

我的 IDE 警告您“从双精度到 T 的未检查转换”。但是编译器无法确定您的代码是否错误,因此它不会发出错误,而只是发出警告。

然后在运行时,由于类型擦除,类型检查不再存在,因此代码将运行而不会出错,除非您执行某些由于运行时类型不兼容而失败的操作。 不是这样的操作。System.out.println()


如果将打印代码更改为

Integer num = numList.get(0);
System.out.println(num);

现在,这将涉及运行时类型检查,因此将失败:

java.lang.ClassCastException: java.lang.Double 不能被强制转换为 java.lang.Integer


答案 2

推荐