gpt4 book ai didi

java - List 将整数转换为 List,为什么这可能?

转载 作者:行者123 更新时间:2023-12-01 23:01:59 25 4
gpt4 key购买 nike

我创建了列表
private final List<Double> prices
我有方法:

public Double getPrice(int i)
{
i--;
if (i >= this.prices.size())
{
return Double.NEGATIVE_INFINITY;
}
return this.prices.get(i);
}

看起来不错......但总是会抛出:
ClassCastException: java.lang.Integer cannot be cast to java.lang.Double


经过一些测试我发现:
我从配置创建此列表,但在配置中我使用不带点的数字,因此代码使用整数而不是 double 创建列表(内部包含整数的ArrayList)
但为什么我可以将此列表转换为 List 而不会出现任何错误?
示例:

Integer a = 1;
Integer b = 1;
Integer c = 1;
Integer d = 1;
List<?> listI = new ArrayList<>(Arrays.asList(a, b, c, d));
List<Double> listD = (List<Double>) listI;
for (Object o : listD)
{
System.out.println(o.getClass().getSimpleName()); // Integer
}
System.out.println("done");

这段代码工作时没有任何错误,但是从双列表中打印整数,为什么不会抛出 ClassCastExceptionList<Double> listD = (List<Double>) listI;
因此,如果您尝试添加 double num = listD.get(0);然后抛出ClassCastException

最佳答案

Java 从调用 Arrays.asList 推断出的泛型类型参数是 asList 参数的常见类型-- Integer ,所以新的ArrayListArrayList<Integer> ,不是 ArrayList<Double> .

Java 不会抛出 ClassCastExceptionList<Double> listD = (List<Double>) listI; ,因为在运行时,类型删除已经发生了,对于 JVM 来说,代码如下所示:

List listD = (List) listI;

这对 JVM 来说完全没问题。

ClassCastException稍后,尝试转换 Integer这实际上是通过将列表转换为 Double 来实现的。 。对于泛型,Java 编译器将向泛型类型参数插入隐式转换,在本例中为 Double ,当检索到一个项目时。然而,这确实是一个Integer .

当你编译这段代码时,在强制转换上应该有一个关于强制转换 List<?> 时的“未经检查的强制转换”的警告。到 List<Double> 。它警告您有关您已经展示的可能性 - 潜力 ClassCastException稍后。

关于java - List<?> 将整数转换为 List<Double>,为什么这可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23278685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com