字符串被分配给列表,而不会出现编译错误

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

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

public static void main(String[] args) {
    String s = getList();
}

private static <T extends List> T getList() {
    return (T)new ArrayList();
}

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


答案 1

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

至于为什么在编译过程中不考虑final,Bohemian对这个问题的评论给出了一个很好的解释。


答案 2