【问题标题】:Compile error: "'<>' cannot be used with anonymous classes" [duplicate]编译错误:“'<>' 不能与匿名类一起使用”[重复]
【发布时间】:2011-08-27 10:54:05
【问题描述】:

我很想写这个:

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 中做到了?

【问题讨论】:

  • 不要与 Java 争吵,不如与 Scala 共舞......
  • 生活中的某些时候,除了战斗,你别无选择。
  • 我不记得 Java 被设计成函数式语言
  • A proposal to implement diamond anonymous types 现在是 Project Coin 的一部分。但自从引入 lambda 表达式以来,现在对我来说似乎有点没有意义。

标签: java java-7


【解决方案1】:

根据project coin documentation

在内部,Java 编译器运行的类型集比 Java 编译器更丰富。 那些可以在 Java 程序中显式写下来的内容。这 不能用 Java 程序编写的编译器内部类型是 称为不可表示类型。不可表示的类型可以作为 钻石使用的推理结果。因此,使用金刚石与 不支持匿名内部类,因为通常这样做 将需要对类文件签名属性进行扩展以 表示不可表示的类型,这是事实上的 JVM 更改。是可行的 未来的平台版本可以允许在创建时使用钻石 一个匿名内部类,只要推断的类型是可表示的。

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

【讨论】:

  • 感谢您的研究。泛型和类型推断的内部结构很有趣但很复杂。
  • 我还是不明白。为什么将类主体添加到构造函数调用会禁用菱形运算符推断类型参数? ArrayList&lt;String&gt; a = new ArrayList&lt;&gt;(); 是合法的,但 ArrayList&lt;String&gt; a = new ArrayList&lt;&gt;() {}; 是不合法的。类型参数很明显是String。为什么匿名类型的类文件不能这么说?
  • 仍然无法使用 java 8
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2014-04-07
    • 2015-02-07
    • 2010-10-27
    相关资源
    最近更新 更多