Request for review: proposal for @FunctionalInterface checking

Brian Goetz brian.goetz at oracle.com
Fri Dec 28 12:12:48 PST 2012


Note that this proposal does NOT intend to change the rule that 
functional interfaces are recognized structurally; single-method 
interfaces will still be recognized as SAMs.  This is more like 
@Override, where the user can optionally capture design intent and the 
compiler can warn when said design intent is violated.

I support this proposal.

On 12/28/2012 3:02 PM, Joe Darcy wrote:
> Hello,
>
> We've had some discussions internally at Oracle about adding a
> FunctionalInterface annotation type to the platform and we'd now like to
> get the expert group's evaluation and feedback on the proposal.
>
> Just as the java.lang.Override annotation type allows compile-time
> checking of programmer intent to override a method, the goal for the
> FunctionalInterface annotation type is to enable analogous compile-time
> checking of whether or not an interface type is functional.  Draft
> specification:
>
> package java.lang;
>
> /**
> Indicates that an interface type declaration is intended to be a
> <i>functional interface</i> as defined by the Java Language
> Specification.  Conceptually, a functional interface has exactly one
> abstract method.  Since default methods are not abstract, any default
> methods declared in an interface do not contribute to its abstract
> method count.  If an interface declares a method overriding one of the
> public methods of java.lang.Object, that also does <em>not</em> count
> toward the abstract method count.
>
> Note that instances of functional interfaces can be created with lambda
> expressions, method references, or constructor references.
>
> If a type is annotated with this annotation type, compilers are required
> to generate an error message unless:
>
> <ul>
> <li> The type is an interface type and not an annotation type, enum, or
> class.
> <li> The annotated type satisfies the requirements of a functional
> interface.
> </ul>
>
> @jls 9.8 Functional Interfaces
> @jls 9.4.3 Interface Method Body
> @jls 9.6.3.8 FunctionalInterface  [Interfaces in the java.lang package
> get a corresponding JLS section]
> @since 1.8
> */
> @Documented
> @Retention(RUNTIME)
> @Target(TYPE)
> @interface FunctionalInterface {} // Marker annotation
>
> Annotations on interfaces are *not* inherited, which is the proper
> semantics in this case.  A subinterface of a functional interface can
> add methods and thus not itself be functional.  There are some
> subtleties to the definition of a functional interface, but I thought
> that including those by reference to the JLS was sufficient and putting
> in all the details would be more likely to confuse than clarify.
>
> Please send comments by January 4, 2013; thanks,
>
> -Joe
>


More information about the lambda-libs-spec-observers mailing list