2017-06-28 3 views
1

私は最近、Javaの理解で説明できないコードを見つけました。それはFuncインタフェースを実装するクラスを取得する必要がありますように私は、その周りにAction.ITEMが構築されている方法を私の頭をラップすることはできません奇妙な構造、静的メソッドをクラスに変換する

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

一部:私は建設の同じ種類のこの小さなバージョンを作成しました。代わりに、暗黙のうちに変換されるメソッドが渡されます。

私の質問は、これがどのように機能し、どのルールがここに当てはまるかです。

+3

メソッド参照についてお読みください。 – Eran

+0

'StaticMethodClass :: IDK'は関数への参照であり、その関数は' Func.exec() 'メソッドと同じパラメータと同じ戻り型を持ちます。したがってこれは既存のメソッドとのインタフェースを実装する短い形式です –

+0

Java docsを参照してください。https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – Akshay

答えて

7

これは比較的新しい構造で、method referenceと呼ばれています。それはFuncインタフェースを実装するクラスを取得する必要がありますように私は、道Action.ITEMが構築され、それのまわりで私の頭をラップすることはできませんJavaの8

までは利用できませんでした。

メソッドの参照は、そのような実装を作成するためのショートカットを提供します。あなたは、コンパイラは限りIDKメソッドのシグネチャがあるとして、「ショートカット」構文によってあなたのためにそれを割り出し

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

を書くのではなく、 Funcexecメソッドの署名の完全一致。

注:ラムダバージョンは、上記のようにメソッド参照がショートカットのショートカットである

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

のショートカット自体です。

+0

これは本当にすっきりしています。 –

+0

私は、これと非常によく似ていると思われる答えを与えることを考えました。しかし残念ながら、あなたは関連するすべての側面をカバーしていました。 – GhostCat

+1

でもあなたのラムダ "ロングバージョンは、" '新しいのFunc(){ \t \t \t @Override \t \t \t公共のexec(整数I、文字列somethingElse){ \t \t \t \t StaticMethodClass.IDK(私のJava 8のショートカットです、somethingElse); \t \t \t} \t \t} '。私はあなたの答えはそれを含めるべきだと思います。 –

関連する問題