gpt4 book ai didi

java - 在 Java 中转换泛型列表

转载 作者:太空狗 更新时间:2023-10-29 22:43:31 26 4
gpt4 key购买 nike

我在转换泛型时发现了一个奇怪的情况。我运行这段代码:

class A { }

class B { }

public class Program {

@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
List<?> list = listA;
((List<B>)list).add(new B());

for (Object item : listA) {
System.out.println(item.toString());
}
}
}

它编译得很好(只有警告但没有错误)并且运行没有任何异常,输出是:

B@88140ed

我是怎么做到的?我的意思是为什么 Java 允许我做这样的事情?我将 B 类的实例添加到 A 的列表中?

这是非常糟糕的泛型行为。为什么会这样?

顺便说一句,我用 Java 7 试过了。

编辑:
让我吃惊的是,Java 只通过警告通知问题,每个程序员都可以忽略它。我知道 SuppressWarnings 是个坏主意,但为什么 Java 没有拒绝这种错误或异常的行为?

此外,这个警告总是显示,如果你认为你的转换是正确的,你别无选择,只能忽略它。但是,如果您认为这是很好的类型转换而忽略了它,但事实并非如此?

最佳答案

每种编程语言都允许您shoot yourself into the foot .

在这种情况下,Java 陷入了两难境地:它可以将泛型信息保留在字节码中并破坏数百万行现有代码,或者在编译器尽最大努力检查并保持向后兼容性后静默删除泛型信息。

Java 团队决定采用后者并引入类型删除 - which has its flaws .但是,如果他们破解了数百万行完美无缺(如果在类型方面不完整)的 Java 代码行,人们就会拿着干草叉和燃烧的 torch 出现......

关于java - 在 Java 中转换泛型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568703/

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