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));
答案 0 :(得分:15)
Stackoverflow问题的存在不足以表明这样的功能是有计划的,甚至没有人会考虑它。
如果你看一下list of JEPs,你会发现没有这样的JEP,即使在草稿状态下也没有这样的特征。
此外,如果查看Java 9 LambdaMetafactory
的当前状态,您将看到没有进行任何更改以支持传递生成带有记录注释数据的运行时类所必需的元信息。
似乎有一些想要添加大量的元信息到实际上应该是一小段丢失的代码,但我怀疑语言设计师会遵循它。 Lambda表达式用于定义封装行为的函数,而不是描述匿名类的替代方法。长期演变将导致lambda表达式实现,甚至更少是普通类。
答案 1 :(得分:8)
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还没有发布。