2017-06-20 89 views
15

This question现在已经超过3年,专门针对Java 8,接受的答案也引用了Java SE 8 Final Specification是否有可能在Java 9中注释lambda表达式?

如果关于这个问题的某些事情会在Java 9中发生变化,我会感兴趣的:有什么办法来注释类似于注释相应的匿名类的lambda表达式吗?


实施例:

译注:

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

注解一个兰巴表达,目前没有在Java中5-8:

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

工作匿名类的注释

Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p)); 
+0

这两个构造之间的一个重要区别是匿名类仍然是一个类的声明。lambda表达式不会创建新类(或者不一定,如果它是实现细节)。我有这样的印象:只有*声明才允许注释*。 *表达式*允许注释吗? – Lii

回答

13

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

如果你看看list of JEPs,你会发现没有这样的JEP,即使在草稿状态下也没有这样的特征。另外,如果您查看Java 9的LambdaMetafactory的当前状态,您将看到没有更改支持传递生成带有记录注释数据的运行时类所需的元信息。

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

+2

'......更不是一个普通的班级'我不能等待发生这种情况, – Eugene

7

按照What's new in Oracle JDK 9页,第这并没有在Java中9

当然改变,即不明确的,但JLS的Java 9一直没有被释放。

6

有趣的是他们做的注释内部类“代表”通过在InnerClassLambdaMetafactory.spinInnerClass lambda表达式:

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

但是,这显然是一个注释类,而不是一个拉姆达每本身。

注解拉姆达将需要改变invokedynamic和隐含的LambdaMetafactory据我可以看到 - 当invokedynamic将创建拉姆达一类会发生什么,但别的,会发生什么对那些注释?