是否可以在 Java 9 中注释 lambda 表达式?

Will it be possible to annotate lambda expression in Java 9?

This question is now over 3 years old and specifically addressed Java 8, with the accepted answer also citing the Java SE 8 Final Specification.

如果关于此问题的某些内容会在 Java 中发生变化,我会很感兴趣 9:是否有任何方法可以像注释相应的匿名 class 一样注释 lambda 表达式?


示例:

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
    public String value();
}

匿名的工作注释class:

Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
};

正在注释 lamba 表达式,目前无法在 Java 8:

中使用
Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p));

根据 What's new in Oracle JDK 9 页面,否。这在 Java 9 中没有改变。

当然,这还不确定,但是 Java 9 的 JLS 尚未发布。

有趣的是,他们通过 :

注释 "represents" InnerClassLambdaMetafactory.spinInnerClass 中的 lambda 表达式的内部 class
 mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true)

但这显然是在注释 class,而不是 lambda 本身。

据我所知,注释 lambda 需要更改 invokedynamic 并隐式更改 LambdaMetafactory - 当 invokedynamic not[=22= 时会发生什么] 为 lambda 创建一个 class,但是 其他东西,那些注释会发生什么?

Whosebug 问题的存在不足以表明计划了这样的功能,即使有人曾经考虑

如果你看list of JEPs,你会发现没有这样的 JEP,甚至在草稿状态下也没有,提示有这样的功能。

此外,如果您查看 Java 9 的 LambdaMetafactory 的当前状态,您会发现没有进行任何更改来支持传递生成运行时所需的元信息class 带有记录的注释数据。

似乎有人希望将大量元信息添加到实际上应该是一小段一次性代码中,但我怀疑语言设计者会遵循它。 Lambda 表达式旨在定义封装 行为 的函数,而不是描述匿名 class 的替代方法。长期的发展将导致 lambda 表达式的实现,它甚至比普通的 class.