转载(https://blog.csdn.net/aitangyong/article/details/54137067)
我们常用的一些接口可赎回,可运行状态,比较器等在JDK8中都添加了@FunctionalInterface注解。
package java.lang;
* @author Arthur van Hoff
* @see java.lang.Thread
* @see java.util.concurrent.Callable
* @since JDK1.0
*/
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
通过JDK8源码的javadoc中,可以知道这个注解有以下特点:
- 如图1所示,该注解只能标记在“有且仅有一个抽象方法”的接口上。
- JDK8接口中的静态方法默认状语从句:方法,都不算是抽象方法。
- 接口默认继承java.lang.Object继承中,所以如果接口显示声明覆盖了对象中方法,那么也不算抽象方法。
- 如图4所示,该注解不是必须的,如果一个接口符合“函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
@FunctionalInterface
public interface xxxFunctionalInterface{
Object xxxAbstractMethod(List param);
}
作用:
使用@FunctionalInterface可以防止以后在接口中添加新的抽象方法签名。就是限定了只能用此抽象方法,别的方法不能用。直接限制死。
@FunctionalInterface
public interface FunctionalInterfaceTest {
Object doMethod(Object a);
}
@Test
public void functionalInterfaceTest() {
test2(list -> {
System.out.println(list);//执行t的doMethod
return "doMethod方法执行完成";
});
}
public void test2(FunctionalInterfaceTest t) {
System.out.println("方法test2被调用");
final Object o = t.doMethod("执行t的doMethod");
System.out.println("打印doMethod的返回值" + o);
}
执行结果:
方法test2被调用
执行t的doMethod
打印doMethod的返回值doMethod方法执行完成