And*_*lko 24 java string generics generic-type-argument type-safety
据我所知,Java中泛型的主要目的之一是提供编译时类型安全性.如果它被编译,代码将运行没有问题.
那么为什么要编译以下代码?
public static void main(String[] args) {
String s = getList();
}
private static <T extends List> T getList() {
return (T)new ArrayList();
}
Run Code Online (Sandbox Code Playgroud)
它汇编很好.我的类型安全编译在哪里?该getList()方法与String班级没有任何共同之处.
Mar*_*her 15
这本身不是类型擦除问题,但几乎相反:在系统知道实际类型时,但在编译时不会在运行时遇到问题.这个编译的原因是它List是一个接口.就编译器而言,String可能实际实现该接口的子类,因此编译器会认为可能存在有效的运行时情况,其中返回的实际对象String也是a List.编译器不认为String是final,因此实际创建List-implementing String类是不可能的.
至于为什么在编辑期间不考虑决赛,波希米亚对这个问题的评论给出了一个很好的解释.