Mar*_*ger 17 java lambda annotations java-9
这个问题现在已经超过3年了,并且专门针对Java 8,接受的答案也引用了Java SE 8最终规范.
如果在Java 9中有关于这个问题的内容会发生变化,我会感兴趣:有没有办法注释类似于注释相应匿名类的lambda表达式?
例:
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
public String value();
}
Run Code Online (Sandbox Code Playgroud)
匿名类的工作注释:
Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() {
@Override
public void accept(String str) {
System.out.println(str);
}
};
Run Code Online (Sandbox Code Playgroud)
注释lamba表达式,目前在Java 8中不起作用:
Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p));
Run Code Online (Sandbox Code Playgroud)
Hol*_*ger 15
Stackoverflow问题的存在不足以表明这样的功能是有计划的,甚至没有人在考虑它.
如果查看JEP 列表,您会看到没有这样的JEP,即使在草稿状态下也没有这样的建议.
此外,如果您查看Java 9的当前状态LambdaMetafactory
,您将看到没有进行任何更改以支持传递生成具有记录的注释数据的运行时类所必需的元信息.
似乎有一些想要添加大量的元信息到实际应该是一小段丢失的代码,但我怀疑语言设计师会遵循它.Lambda表达式用于定义封装行为的函数,而不是描述匿名类的替代方法.长期演变将导致lambda表达式实现,甚至更少是普通类.
有趣的是,他们注释了"代表" InnerClassLambdaMetafactory.spinInnerClass
via中lambda表达式的内部类:
mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true)
Run Code Online (Sandbox Code Playgroud)
但这显然是在诠释一个阶级,而不是一个lambda本身.
注释拉姆达将需要改变invokedynamic
和隐式的LambdaMetafactory
,据我可以看到-当invokedynamic会会发生什么,不为拉姆达创建一个类,而是别的东西,会发生什么样的注解?
归档时间: |
|
查看次数: |
1319 次 |
最近记录: |