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

时间:2011-08-27 10:54:06

标签: java java-7

我非常想写这个:

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?

中完成的

2 个答案:

答案 0 :(得分:14)

根据project coin documentation

  

在内部,Java编译器在比一组更丰富的类型上运行   那些可以在Java程序中明确写下来的。该   无法在Java程序中编写的编译器内部类型   称为不可表示的类型。不可表示的类型可以作为   钻石使用推断的结果。因此,使用钻石   一般来说,不支持匿名内部类   需要扩展类文件签名属性   表示不可表示的类型,事实上的JVM更改。这是可行的   未来的平台版本可以允许在创建时使用钻石   只要推断类型是可表示的,就是匿名内部类。

修改 所以在未来的版本中它是可能的。 Java 8仍然无法实现,但现在我们有了lambdas,因此不再需要它。

答案 1 :(得分:3)

现在计划将其包含在Java 9中。来自JEP 213: Milling Project Coin

  
      
  1. Allow diamond with anonymous classes if the argument type of the inferred type is denotable。因为使用带有匿名类构造函数的菱形的推断类型可能在签名属性支持的类型集之外,所以在Java SE 7中不允许使用具有匿名类的菱形。如JSR 334提出的最终草案所述,它将是如果推断类型是可表示的,则可以减轻此限制。
  2.