编译错误:“'<>'不能与匿名类一起使用”

2022-09-03 06:31:21

我宁愿写这个:

Lists.transform(vals,
    new Function<>() {
        public List<ValEntry> apply(Validator<? super T> input) {
            return input.validate(value);
        }
    });

...比这:

Lists.transform(vals,
    new Function<Validator<? super T>, List<ValEntry>>() {
        public List<ValEntry> apply(Validator<? super T> input) {
            return input.validate( value );
        }
    });

但是Java编译器给了我以下错误消息:

'<>' cannot be used with anonymous classes

这有根本原因吗?还是只是跳过了JDK 7中的功能,也许他们在8中做到了?


答案 1

根据项目硬币文档

在内部,Java编译器在一组比可以在Java程序中显式写下的类型更丰富的类型上运行。无法在 Java 程序中编写的编译器内部类型称为不可通知类型。不可识别的类型可能是由于菱形使用的推论而发生的。因此,不支持将菱形与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不可识别的类型,这是事实上的 JVM 更改。未来的平台版本可以在创建匿名内部类时使用菱形,只要推断的类型是可注意的。

编辑因此,在未来的版本中是可能的。这在Java 8中仍然是不可能的,但现在我们有了lambdas,所以需求就更少了。


答案 2

现在计划将其包含在Java 9中。来自 JEP 213: 铣削项目硬币

  1. 如果推断类型的参数类型是可识别的,则允许使用匿名类的菱形。由于使用带有匿名类构造函数的菱形推断类型可能不在签名属性支持的类型集之外,因此在 Java SE 7 中不允许将菱形与匿名类结合使用。正如JSR 334提议的最终草案中所指出的,如果推断的类型是可注意的,则可以放宽这一限制。

推荐