标注为FunctionalInterface的接口被称为函数式接口,该接口只能有一个自定义方法,但是可以包括从object类继承而来的方法。如果一个接口只有一个方法,则编译器会认为这就是一个函数式接口。例如这样写:
package com.life;
public interface Hello {
void test();
}
如果在接口上面加入@FunctionalInterface注解,那么该接口就会被强制要求符合函数式接口的规范,比如可以这样写:
package com.life;
@FunctionalInterface
public interface Hello {
void test();
}
也可以添加继承自object的类的方法:
package com.life;
@FunctionalInterface
public interface Hello {
void test();
String toString();
}
但是如果下面这样,在一个接口中定义两个自定义的方法,就会产生Invalid '@FunctionalInterface' annotation; Hello is not a functional interface错误:
package com.life;
@FunctionalInterface
public interface Hello {
void test();
String toStringA();
}
Java中FunctionalInterface接口是如下定义的:
package java.lang;
import java.lang.annotation.*;
/**
* An informative annotation type used to indicate 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 {@linkplain java.lang.reflect.Method#isDefault()
* default methods} have an implementation, they are not abstract. If
* an interface declares an abstract method overriding one of the
* public methods of {@code java.lang.Object}, that also does
* <em>not</em> count toward the interface's abstract method count
* since any implementation of the interface will have an
* implementation from {@code java.lang.Object} or elsewhere.
*
* <p>Note that instances of functional interfaces can be created with
* lambda expressions, method references, or constructor references.
*
* <p>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>
*
* <p>However, the compiler will treat any interface meeting the
* definition of a functional interface as a functional interface
* regardless of whether or not a {@code FunctionalInterface}
* annotation is present on the interface declaration.
*
* @jls 4.3.2. The Class Object
* @jls 9.8 Functional Interfaces
* @jls 9.4.3 Interface Method Body
* @since 1.8
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
更多学习参考:https://www.zhihu.com/question/28292740/answer/40336090
函数式接口@FunctionalInterface
最新推荐文章于 2024-06-03 00:45:24 发布