Said in Javadoc:
If a type is annotated with this annotation type, compilers are required to generate an error message unless ...
@FunctionalInterface is for runtime reflection, compile check, and java runtime process probably.
javap is used to de-compile and compare two interfaces, one with @FunctionalInterface, the other none.
Just extra two lines byte code in @FunctionalInterface tagged interface:
Constant pool:
#7 = ... RuntimeVisibleAnnotations
#8 = ... Ljava/lang/FunctionalInterface;
And both implementation/lambda express are same at byte code level.
Except for interface reflection:
X.class.getAnnotation(FunctionalInterface.class) == null?;