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条答案
按热度按时间7vux5j2d1#
堆栈溢出问题的存在并不足以表明这样的特性是计划好的,甚至不足以表明有人曾经考虑过它。
如果您查看list of JEPs,您将看到没有这样的JEP,甚至在草稿状态下也没有,建议这样的特性。
此外,如果您查看Java 9的
LambdaMetafactory
的当前状态,您将看到没有进行任何更改来支持传递 meta信息,而元信息是生成具有记录的注解数据的运行时类所必需的。似乎有一些人希望在实际上应该是一小段被丢弃的代码中添加大量的元信息,但我怀疑语言设计者是否会遵循它。Lambda表达式旨在定义一个封装 behavior 的函数,而不是描述匿名类的替代方法。长期的发展将导致Lambda表达式实现甚至更不像普通类。
xeufq47z2#
有趣的是,它们确实通过以下方式注解了
InnerClassLambdaMetafactory.spinInnerClass
中“表示”lambda表达式的内部类:但这显然是注解类,而不是lambda本身。
注解一个lambda需要修改
invokedynamic
,并且就我所知,隐式地修改LambdaMetafactory
--当invokedynamic * 不 * 为lambda创建一个类,而是 * 其他东西 * 时会发生什么,这些注解会发生什么?cqoc49vn3#
根据What's new in Oracle JDK 9页面,没有。这在Java 9中没有改变。
当然,这并不是最终的结果,但是Java 9的JLS还没有发布。