簡體   English   中英

功能界面如何在java 8中工作

[英]How the functional interface working in java 8

這是我在研究功能界面概念時遇到的一個例子。

interface Sayable{  
   void say();  
}  
public class MethodReference {  
    public static void saySomething(){  
        System.out.println("Hello, this is static method.");  
    }  
    public static void main(String[] args) {  
        // Referring static method  
        Sayable sayable = MethodReference::saySomething;  
        // Calling interface method  
        sayable.say();  
    }  
} 

這是打印“你好,這是靜態方法”。 輸出時運行。 我的問題是當我們調用say()方法(未實現)時如何打印輸出

你可以想到這樣的方法參考:

Sayable sayable = new Sayable() {

    @Override
    void say() {
        // Grab the body of the method referenced by the method reference,
        // which is the following:
        System.out.println("Hello, this is static method.");
    }
}

方法引用有效,因為

  • 目標類型是功能接口 Sayable (您試圖將結果存儲為Sayable類型);
  • saySomething()的方法引用的簽名與函數接口方法say() saySomething()匹配,即參數返回類型匹配1

Sayable實例的say()方法的Sayable稱為變量sayable等於方法引用引用的方法的主體。

就像JB Nizet在評論中所說的那樣, say()實際上已經實現了。


1一點點細節:“匹配”這個詞並不完全意味着“相等”。 例如,如果saySomething()返回一個int ,它仍然可以工作,盡管目標類型的唯一方法將返回類型定義為void

基本上只有一個抽象方法的接口是Functional接口。

如果要匿名創建接口對象並調用MethodReference的saySomething()。 通常情況下會是這樣的..

Sayable sayable = new Sayable() {
  @Override
    void say() {
       MethodReference::saySomething;  
    }
}

在功能界面的情況下,因為總是只有一種方法。 你可以忽略say()和相關的括號 - 這是由lambdas提供的。

所以你可以說。

Sayable sayable = MethodReference::saySomething;  

這僅適用於功能接口。 不適用於具有多個抽象方法的接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM