Java 8才引入函数式接口,为何@FunctionalInterface可在Java7及更低版本运行?
现象原因解释
你遇到的这个情况是Java注解的默认处理规则导致的,和@FunctionalInterface本身的版本约束没有冲突:
- JDK 8才把
@FunctionalInterface加入内置注解库,JDK 6、7的核心类库中根本不存在这个注解的定义。 - Java编译器处理注解时,如果找不到对应注解的类信息,会直接忽略该注解,不会触发编译错误。你写的
@FunctionalInterface在JDK 6编译时直接被当成无效注解跳过了,相当于你写的就是一个普通的单抽象方法接口,自然可以正常编译运行。 - 另外
@FunctionalInterface本身只是编译期检查的标记注解,没有任何运行时逻辑,就算被忽略也不会影响接口的正常使用。只有在存在该注解定义的编译环境(JDK 8+)中,编译器才会检查被标记的接口是否满足「只有一个抽象方法」的函数式接口要求,不符合的话才会报编译错误。
补充验证:如果你在JDK 6的项目中手动创建
java.lang.FunctionalInterface注解类,再编译你给出的代码,就会触发你自定义注解的处理规则;如果你的自定义注解设置了编译期检查逻辑,不符合要求时才会出现编译报错。
内容的提问来源于stack exchange,提问作者Kuldeep Shrivastava
相关产品推荐
相关产品推荐

