nro*_*fis 16 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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
它编译得非常好(只有警告但没有错误)并且没有任何异常运行,输出为:
乙@ 88140ed
我是怎么做到的?我的意思是为什么Java允许我做这样的事情?我B
在A
s 列表中添加了一个类实例?
这是非常糟糕的泛型行为.为什么会这样?
顺便说一下,我用Java 7尝试过.
编辑:
让我感到惊讶的是,Java只通知问题,并警告每个程序员都可以忽略它.我知道这SuppressWarnings
是个坏主意,但为什么Java没有拒绝这样的错误或异常行为?
此外,这个警告始终显示,如果你认为你的演员是正确的,你别无选择,只能忽略它.但是,如果你认为这是好的铸造并忽略它但不是吗?
Aar*_*lla 19
每种编程语言都可以让你自己动手.
在这种情况下,Java处于两难境地:它可以将泛型信息保留在字节码中并打破数百万行现有代码,或者在编译器最大限度地检查并保持向后兼容性之后静默删除泛型信息.
Java团队决定采用后者并引入了类型擦除 - 这有其缺陷.但如果他们打破了数以百万计的完美无缺(如果类型不完整)的Java代码行,人们就会出现干草叉和火炬......
归档时间: |
|
查看次数: |
1056 次 |
最近记录: |