java - 为什么 diamond 不能推断匿名内部类的类型?

标签 java java-7 type-inference

在 Java 7 及更高版本中,diamond 可用于正常推断类型,如下所示:

List<String> list = new ArrayList<>();

但是,它不能用于这样的匿名内部类:

List<String> st = new List<>() { //Doesn't compile

    //Implementation here

}

这是为什么?从逻辑上讲,在这种情况下,我绝对可以将类型推断为 String。这个决定是否存在逻辑上的原因,即类型实际上不能在匿名内部类上推断出来,还是因为其他原因而被省略?

最佳答案

JSR-334 :

Using diamond with anonymous inner classes is not supported since doing so in general would require extensions to the class file signature attribute to represent non-denotable types, a de facto JVM change.

我的猜测是,众所周知,匿名类会导致生成自己的类文件。

我想这些文件中不存在泛型类型,而是由有效(静态)类型代替(因此在声明对象时由显式类型如 <String> 声明)。

确实,对应于内部类的文件永远不会在它的多个不同实例之间共享,那么为什么还要在其中使用泛型呢?! :)。

编译器强制对这些类文件进行扩展(通过为泛型添加特殊属性)将更难以实现(而且肯定是无用的)。

关于java - 为什么 diamond 不能推断匿名内部类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821586/

相关文章:

java - Maven:从执行元素获取目标配置

java - htmlunit 在运行项目后总是给出多个 javascript 异常

c++11 - C++1y 返回类型推断

java - 解析时间戳时,时区重要吗?

datetime - F#,小类型推断/注释错误

java - 推理变量具有不兼容的界限。 Java 8 编译器回归?

java - 第二个查询说,结果集已关闭

java.lang.NoClassDefFoundError : org/springframework/core/io/Resource Exception

java - 为什么我不能将 List<X<Long>> 作为 List<X<?>> 的参数

java - 管理到 Java 7 的升级