@FunctionalInterface如何影响JVM的运行时行为?

fge*_*fge 5 java annotations java-8

我最初的问题是这个问题的完全重复; 也就是说,为什么这个接口有一个运行时保留策略.

但是接受的答案根本不能满足我,原因有两个:

  • 事实上这个界面@Documented(我相信)与它无关(虽然为什么@Documented运行时保留策略对我来说也是一个谜);
  • 尽管在Java 8之前Java中存在许多"将来"功能接口(Comparable正如答案所提到的那样,但也Runnable等),这并不妨碍它们被用作"替代品"(例如,你可以完美地使用DirectoryStream.Filteras作为例如,Predicate如果您所做的只是过滤Path,则替换为a .

但是,它仍有这种保留.这意味着它必须以某种方式影响JVM行为.怎么样?

Tag*_*eev 5

我在core-libs-dev邮件列表中找到了该线程,该线程讨论了@FunctionalInterface批注的保留。此处提到的要点是允许第三方工具使用此信息进行代码分析/验证,并允许非Java JVM语言将其lambda正确映射到功能接口。一些摘录:

Joe Darcy(的原始提交者@FunctionalInterface):

我们有意使此注释具有运行时保留时间,以使它也可以在运行时等各种工具中查询。

布莱恩·格茨

除Java之外的其他语言都有一个好处,可以将其用作确定接口是否适合传递给SAM转换机制的手段。JDK对lambda转换的支持也可用于其他语言。

看来JVM本身并没有使用它,这只是第三方工具的另一种可能性。使注释在运行时可见不是很大的代价,因此似乎没有充分的理由不这样做