我在铸造泛型时发现了一个奇怪的情况。我运行以下代码:
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
class的实例添加到A
s的列表中?
泛型的行为非常糟糕。为什么会这样呢?
顺便说一句,我尝试使用Java 7。
编辑:
让我感到惊讶的是Java仅通过警告每个程序员都可以忽略它的方式通知问题。我知道这SuppressWarnings
是个坏主意,但是为什么Java不会通过错误或异常来拒绝这种行为?
此外,该警告始终显示,如果您认为自己的转换正确无误,则别无选择,只能忽略它。但是,如果您认为这是一种很好的选择,而忽略却不是呢?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句