在 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/