用Java转换泛型列表

诺菲斯

我在铸造泛型时发现了一个奇怪的情况。我运行以下代码:

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允许我这样做?我将Bclass的实例添加As的列表中

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

顺便说一句,我尝试使用Java 7。

编辑:
让我感到惊讶的是Java仅通过警告每个程序员都可以忽略它的方式通知问题。我知道这SuppressWarnings是个坏主意,但是为什么Java不会通过错误或异常来拒绝这种行为?

此外,该警告始终显示,如果您认为自己的转换正确无误,则别无选择,只能忽略它。但是,如果您认为这是一种很好的选择,而忽略却不是呢?

亚伦·迪古拉(Aaron Digulla)

每种编程语言都可以让您立足

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

Java团队决定采用后者,并引入了Type Erasure-它有缺陷但是,如果他们破坏了数百万条完全正确的Java代码行(如果是类型上不完整的话),人们就会出现干草叉和燃烧的火把...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章