java - 字符串被分配给列表而没有编译错误

标签 java string generics type-safety generic-type-argument

据我所知,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/

相关文章:

java - ArrayList<Integer> 接受字符串

java - 为什么以下类型在 Java 中是可具体化和不可具体化的?

java - 使用Java在android中加载DXT纹理文件

java - 属性文件中的十六进制值 : JAVA

templates - MediaWiki 模板中的字符串函数?

node.js - 在 Node 中,如何删除以某些特定字符结尾的子字符串

C:strcpy 的段错误

java - Java 7/8 泛型中嵌套通配符的可分配性差异

java - 在Android Studio中发送开放声音控制(OSC),套接字错误

java - 似乎无法弄清楚如何使用 primefaces 重定向到 .xhtml