函數接口(Functional Interfaces)


定義

首先,我們先看看函數接口在《Java語言規范》中是怎么定義的:

函數接口是一種只有一個抽象方法(除Object中的方法之外)的接口,因此代表一種單一函數契約。函數接口的抽象方法可以是從超級接口繼承而來,但繼承而來的方法應該是覆寫等效的( override-equivalent ),這種情況,在邏輯上,代表一個方法。

創建函數接口實例,除了以聲明和實例化類的形式這種常規過程之外,還可以使用方法引用表達式和lambda表達式創建函數接口的實例。

聲明函數接口時,除了要聲明一個抽象方法,還可以聲明覆寫Object類中的public方法以及default方法。

以下舉例說明

示例一:最常見的函數接口形式

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);
}

示例三:只包含覆寫Object的公共方法的接口,不屬於函數接口

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);
}

示例四:繼承父接口的Object類的公共方法,自身聲明了一個非Object類的公共方法,也屬於函數接口

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);
}

示例五:包含覆寫Object類公共方法的函數接口

/**
 * @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);
}

示例六:既包含覆寫Object中equals方法,又包含default方法的函數接口

/**
 * @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{
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM