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

时间:2017-06-20 07:46:39

标签: java lambda annotations java-9

This question现已超过3年,专门针对Java 8,接受的答案也引用了Java SE 8 Final Specification

如果有关于这个问题的内容在Java 9中有所改变,我会感兴趣:有没有办法注释一个类似于注释相应匿名类的lambda表达式?

示例:

注释:

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

匿名类的工作注释:

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));

3 个答案:

答案 0 :(得分:15)

Stackoverflow问题的存在不足以表明这样的功能是有计划的,甚至没有人会考虑它。

如果你看一下list of JEPs,你会发现没有这样的JEP,即使在草稿状态下也没有这样的特征。

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

似乎有一些想要添加大量的元信息到实际上应该是一小段丢失的代码,但我怀疑语言设计师会遵循它。 Lambda表达式用于定义封装行为的函数,而不是描述匿名类的替代方法。长期演变将导致lambda表达式实现,甚至更少是普通类。

答案 1 :(得分:8)

有趣的是,他们注释了#34;代表的内部阶级&#34; InnerClassLambdaMetafactory.spinInnerClass中的lambda表达式:

 mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true)

但这显然是在诠释一个阶级,而不是一个lambda本身。

注释一个lambda将需要更改invokedynamic并隐含LambdaMetafactory,据我所知 - 当invokedynamic 创建一个类时会发生什么lambda,但别的东西,这些注释会发生什么?

答案 2 :(得分:7)

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

当然,这不是确定的,但JLS for Java 9还没有发布。