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

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类是不可能的.

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