首先,咱们先看看函数接口在《Java语言规范》中是怎么定义的:html
函数接口是一种只有一个抽象方法(除Object中的方法以外)的接口,所以表明一种单一函数契约。函数接口的抽象方法能够是从超级接口继承而来,但继承而来的方法应该是覆写等效的( override-equivalent ),这种状况,在逻辑上,表明一个方法。java
建立函数接口实例,除了以声明和实例化类的形式这种常规过程以外,还能够使用方法引用表达式和lambda表达式建立函数接口的实例。spring
声明函数接口时,除了要声明一个抽象方法,还能够声明覆写Object类中的public方法以及default方法。ide
如下举例说明:函数
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 19:59 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 最多见的函数接口形式:只声明了一个抽象方法 */ public interface Job { void execute(); }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 21:13 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 最多见的泛型函数接口形式:只声明了一个抽象方法 */ public interface Work<T> { T doWork(Object o); }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 20:16 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 覆写Object的equals方法,不属于函数接口 */ public interface NonFunctionInterface { boolean equals(Object obj); }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 20:22 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 继承的父接口,虽然不是函数接口,可是此接口声明了抽象方法,此方法不属于Object类的public方法,所以属于函数接口 */ public interface EquivalentInterface <T> extends NonFunctionInterface{ int compare(T o1, T o2); }
/** * @author 春晨 * @date 2019/1/20 20:24 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 包含覆写Object中equals方法的函数接口 */ public interface EquivalentInterface <T> { int compare(T o1, T o2); boolean equals(Object obj); }
/** * @author 春晨 * @date 2019/1/20 20:26 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 既包含覆写Object中equals方法,又包含default方法的函数接口 */ public interface EquivalentInterface <T> { int compare(T o1, T o2); boolean equals(Object obj); default String name(){ return "EquivalentInterface"; } }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 20:36 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 函数接口的抽象方法能够是从X、Y两个父接口继承而来,但继承而来的valueOf方法是覆写等效,所以Z接口也属于函数接口 */ interface X{ int valueOf(String x); } interface Y{ int valueOf(String y); } public interface Z extends X, Y{ }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 20:41 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 函数接口的抽象方法能够是从A、B两个父接口继承而来,但继承而来的convert方法是覆写等效,所以C接口也属于函数接口 */ interface A{ Iterable convert(Iterable<String> arg); } interface B{ Iterable<String> convert(Iterable arg); } public interface C extends A, B{ }
package org.springmorning.demo.javabase.annotation.pre; /** * @author 春晨 * @date 2019/1/20 20:53 * Copyright ©2019 春晨 https://www.cnblogs.com/springmorning/p/10296022.html * * @Description 函数接口的抽象方法能够是从O、P两个父接口继承而来,但继承而来的classInfo方法是覆写等效,所以Q接口也属于函数接口 */ interface O <T>{ T classInfo(Class<?> c); } interface P <S>{ S classInfo(Class<?> c); } public interface Q extends O, P{ }