java - 在 Java 中转换泛型列表

标签 java generics wildcard

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

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/

相关文章:

java - 如何在Windows上创建程序数据的本地文件夹(在%APPDATA%中,无需授予权限,JAVA)

java - 尝试从 TextView 获取值并将其发送到 firebase 引用,但应用程序崩溃了

具有通用 self 类型的 Scala 特征

apache - 如何在 Apache 中使用 SSL 配置多个子域?

git - 有没有办法在 git checkout 中使用通配符?

php - php 的 strpos 函数中的通配符

javascript - JavaFX Web View :sending a String from javafx to js webview

java - Android:如何更改 DatePicker 值

c# - 应用约束的通用错误

c# - EF 通用存储库多重包含和按调用排序