我正在运行这一小段代码:
List abc = new ArrayList();
abc.add("something");
List raw = abc;
List def = raw;
System.out.println(def.get(0));
我不明白为什么当包含String成员的列表被分配给整数列表时它不会抛出异常.而且,整数列表如何存储和打印字符串?有人可以帮帮我吗?
解决方法:
这就是你不应该使用原始类型的原因.
当你这样做
List raw = abc;
你自己用列表擦除类型.所以它们没有类型,也没有编译器的错误.要获得泛型的好处,您应该避免使用原始类型.
并且还考虑阅读大约Type Erasing.在运行时,列表不知道他们的类型.类型被删除,它们只是获得列表中的任何可用内容.
您期望的错误是编译器错误,同时您避免首先提供类型.因此没有错误.
如果您确实想要查看异常,请尝试将当前列表中的元素分配给Integer.虽然编译器不会给你任何错误,但在运行时类型会匹配并且你会遇到异常.
如果你看一下Raw Types docs,你会看到几乎相同的例子
Box stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8); // warning: unchecked invocation to set(T)
The warning shows that raw types bypass generic type checks, deferring the catch of unsafe code to runtime. Therefore, you should avoid using raw types.
标签:raw-types,java,generics
来源: https://codeday.me/bug/20190724/1522050.html