2017-02-01 9 views
2

Java 8のメソッドのグループを参照する方法はありますか?そのシグネチャはオーバーロードの方法によって異なりますか?Java 8のメソッド参照:オーバーロードがサポートされていますか?

より正確には、私はこのコードが動作したい

public class OverloadingMethodRef 
{ 
    public static void foo (int x) { 
     System.out.println ("An integer: " + x); 
    } 

    public static void foo (String x) { 
     System.out.println ("A String: " + x); 
    } 

    /** 
    * I want it to work without this 
    */ 
// public static void foo (Object x) { 
//  if (x instanceof Integer) foo ((int) x); else foo ((String) x); 
// } 

    public static void main (String[] args) 
    { 
     // Compile error, it wants a precise reference to one of them 
     Consumer<Object> c = PolymorphicMethodRef::foo; 
     foo ("bla"); // despite it could get it 
     foo (1); // and here too 
    } 
} 

私は別のメソッドに渡す方法がたくさんあると私は書きたくないので、私は、public static void foo (Object x)を追加する余裕がありませんラッパー。これまでは、リフレクション(param.getClass()を受け取ることができます)を介してのみこれを行うことができましたが、呼び出す必要のあるメソッドはさまざまな引数(> = 1)を持ち、配列に入れたり、

+3

はい多型がサポートされています。また、それは多形性ではなく、**過負荷です**。コンパイル時に特定のメソッドオーバーロードへのJavaワイヤメソッド呼び出しがあります。 –

+0

おしゃべり!はい、私は過負荷を意味し、私は、問題を修正、ありがとう。 – zakmck

+1

オーバーロードされたメソッドを指しているかのように動作するメソッド参照を取得することは、実際には不可能です。あなたができることは、 'void foo(Object x)'のような別のメソッドを追加してコンシューマを取得することですが、常にObjectメソッドを使ってそのメソッドを呼び出すことはできません。 –

答えて

5

メソッド参照は、通常のメソッド呼び出しと同じ規則を使用してオーバーロードをサポートします。あなたはConsumer<Object>を持っている場合は、あなたが

Consumer<Object> c = /* some expression producing it*/; 
c.accept(new JButton()); 
// or just 
c.accept(new Object()); 

を書くことができますつまり、あなたは、そのaccept方法に任意Objectインスタンスを渡すことができますし、あなただけfoo(int)と持っているとき、あなたは

foo(new JButton()); 
// or 
foo(new Object()); 

を書き込むことはできませんので、 foo(String)は、それがを構築するだろう

Consumer<Object> c = OverloadingMethodRef::foo; 

を書くことも不可能です任意のObjectインスタンスを受け入れるふりをする。

あなたはリフレクションのオーバーヘッドを受け入れて喜んでいる場合は、もちろん

Consumer<Object> c=o -> { 
    try { 
     new Statement(OverloadingMethodRef.class, "foo", new Object[]{o}).execute(); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex); 
    } 
}; 
c.accept(42); 
c.accept("bla"); 

(これはjava.beans.Statementを参照)

を使用することができ、サポートされていない引数で呼び出されたときに、これは実行時に失敗することができますタイプ。

+0

ありがとう@Holger。実際には、これはJavaから欠けています:-)私はそれが静的な型チェックと一線を画していることを理解していますが、まだそれほど良くありません(任意のオブジェクトを受け入れ、実行時にバインドし、コンパイル時に警告を出す方が良いでしょう)。リフレクション、私は 'org.apache.commons.lang3.reflect.MethodUtils'を使用しています。これは構文が単純です。 – zakmck

関連する問題