2017-06-28 77 views
1

我最近偶然發現了一段我無法用我對java的理解來解釋的代碼。我創造了這個小版本同種結構的:奇怪的構造,java將靜態方法轉換爲類

public class StaticMethodClass { 
    static void IDK(Integer i, String somethingElse) { 
     System.out.println("It has been done"); 
    } 

    public static void main(String... whatever) { 
     Action.ITEM.doStuff(); 
    } 
} 

interface Func { 
    void exec(Integer i, String somethingElse); 
} 

enum Action { 
    ITEM(StaticMethodClass::IDK); 

    private Func f; 

    Action(Func f){ 
     this.f = f; 
    } 

    void doStuff() { 
     this.f.exec(1, "huh"); 
    } 
} 

的一部分,我不能環繞它我的頭Action.ITEM的方式構造,因爲它應該得到落實Func接口的類。相反,它傳遞了一種方法,它以某種方式隱式轉換。

我的問題是這是如何工作的,以及這裏適用的規則。

+3

您應該閱讀有關方法參考。 – Eran

+0

'StaticMethodClass :: IDK'是一個函數的引用,該函數具有與'Func.exec()'方法相同的參數和相同的返回類型,因此這是一種使用已有方法實現接口的簡短形式 –

+0

請參閱Java文檔https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – Akshay

回答

7

這是一個相對較新的構造,名爲method reference。這是不可用,直到8的Java

我不能換我的頭周圍的方式Action.ITEM構造,因爲它應該得到一個類實現Func接口。

方法引用創建這樣的實現提供了一條捷徑:不是你寫

ITEM((i, e) -> StaticMethodClass.IDK(i, e)); 

編譯器計算它爲你通過「捷徑」的語法,只要IDK方法的簽名是完全匹配Funcexec方法的簽名。

注:上述 LAMBDA版本本身是

ITEM(new Func() { 
    @Override public exec(Integer i, String somethingElse) { 
     StaticMethodClass.IDK(i, somethingElse); 
    } 
}); 

快捷方式,以便方法參考爲快捷鍵的快捷方式。

+0

這真的很整潔,謝謝澄清。 –

+0

我想過給出一個看起來非常像這個的答案。但不幸的是,你涵蓋了所有相關的方面......沒有任何結果,只是提升。 – GhostCat

+1

即使你的拉姆達 「長版」 是一個java 8快捷方式'新Func鍵(){ \t \t \t @覆蓋 \t \t \t公共EXEC(整數i,字符串somethingElse){ \t \t \t \t StaticMethodClass.IDK(我,somethingElse); \t \t \t} \t \t};'。我認爲你的答案應該包括這一點,爲窮舉。 –