首先,咱們先看看函數接口在《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{ }