字符串被分配给List而没有编译错误

据我所知,Java中generics的主要目的之一是提供编译时类型安全性。 如果它被编译,代码将运行没有问题。

那么为什么要编译以下代码?

public static void main(String[] args) { String s = getList(); } private static  T getList() { return (T)new ArrayList(); } 

它汇编很好。 我的类型安全编译在哪里? getList()方法与String类没有任何共同之处。

这本身不是类型擦除问题,但几乎相反:当系统知道实际类型时,您在运行时遇到问题,但在编译时却不知道。 这个编译的原因是List是一个接口。 就编译器而言, String的子类实际上可能实现该接口,因此编译器会认为可能存在有效的运行时情况,其中返回的实际对象是也是ListString 。 编译器不认为String是final,因此实际创建List -implementing String类是不可能的。

至于为什么在编辑期间不考虑决赛,波希米亚对这个问题的评论给出了一个很好的解释。

Interesting Posts