据我所知,Java 中泛型的主要目的之一是提供编译时类型安全。如果它被编译,代码将毫无问题地运行。
那为什么要编译下面的代码呢?
public static void main(String[] args) {
String s = getList();
}
private static <T extends List> T getList() {
return (T)new ArrayList();
}
它编译得很好。我的类型安全编译在哪里? getList()
方法与 String
类没有任何共同之处。
最佳答案
这本身不是类型删除问题,但几乎相反:当系统知道实际类型时,您在运行时遇到问题,但在编译时不知道。这个编译的原因是 List
是一个接口(interface)。就编译器而言,String
的子类可能实际上实现了该接口(interface),因此编译器认为可能存在有效的运行时情况,其中返回的实际对象是 String
那也是一个List
。编译器不认为 String 是最终的,因此不可能实际创建一个 List
-实现 String
类。
至于为什么在编译过程中不考虑final,Bohemian对这个问题的评论给出了很好的解释。
关于java - 字符串被分配给列表而没有编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305730/