2017-09-15 6 views
2

Javaでは、非静的メソッド参照とクラスのインスタンスを指定すると、そのクラスインスタンスがそのメソッドを呼び出すことを何らかの方法で通知できますか?Instanceメソッド参照インスタンス引数の場合

擬似例:

public Object methodApply(Function<Object,Object> method, Object instance, List<Object> args) { 
    return instance.method(args); 
} 
+2

'とmethodApply()入力型と出力型の両方反射を探しているかもしれませんか? –

+0

@JoeC良いキャッチ!修正するために編集 –

答えて

3

あなたはどんなクラスで宣言されたオブジェクトに任意のメソッドを呼び出すメソッドを宣言することはできませんが、あなたがreflectionを使用している場合。
反射アプローチの欠点は、メソッド/アクセスが有効でない場合、実行時に例外が発生する可能性があることです。

のJava 8で、あなたは(それがラムダ式にこれだけの代替です)はどのmethod referenceだけは、機能インタフェースを実装するために渡してもよいです。
このメソッドの参照は、機能インタフェース記述子に従わなければならないという制限があります。


あなたが本当にあなたの必要性を実装するために型の安全性からのJava 8と利益を使用したい場合、あなたは、ラムダの一部を行わない変数にメソッド参照を呼び出すことができる利点を取る必要があります。
しかし、機能インタフェースが受け入れる引数の数は可変ではないことにも注意してください。
したがって、異なる数の引数を受け入れるように汎用メソッドをオーバーロードする必要があります。例えば

あなたは呼び出されたメソッドへの引数を渡したい場合は、methodApply()Function<T,R>パラメータを持っている必要があります。

public static <T, R> R methodApply(Function<T, R> function, T arg) { 
    return function.apply(arg); 
} 

しかし、あなたは呼び出されたメソッドに二つの引数を渡すことができるまでにもしたい場合は、 methodApply()が過負荷とそうBiFunction<T, U, R>パラメータを持っていることが必要です。

public static <T, U, R> R methodApply(BiFunction<T, U, R> function, T argOne, U argTwo) { 
    return function.apply(argOne, argTwo); 
} 

あなたはより多くのパラメータを渡す必要がある場合、あなたはもちろん、独自の楽しさを作成することができますインタフェース:TriFunctionQuadriFunctionと同じ方法でメソッドをオーバーロードします。追加した後に機能

連結= Hello Worldの

methodApply():

import java.util.ArrayList; 
import java.util.List; 
import java.util.function.BiFunction; 
import java.util.function.Function; 

public class FunctionHelper { 

    public static void main(String[] args) { 

     System.out.println("methodApply() with Function" + System.lineSeparator()); 
     // String.concat 
     String oneString = "hello"; 
     String concatenated = methodApply(oneString::concat, " world"); 
     System.out.println("concatenated="+ concatenated); 

     // List add/remove 
     List<String> list = new ArrayList<>(); 
     methodApply(list::add, concatenated); 
     System.out.println("after adding, list="+list); 
     methodApply(list::remove, concatenated); 
     System.out.println("afer removing, list="+list); 

     System.out.println("---------------------------"+ System.lineSeparator()); 

     System.out.println("methodApply() with BiFunction" + System.lineSeparator()); 
     // String.substring 
     oneString = "hello world";  
     System.out.println("substring=" + methodApply(oneString::substring, 0, 6)); 
    } 

    public static <T, R> R methodApply(Function<T, R> function, T arg) { 
     return function.apply(arg); 
    } 

    public static <T, U, R> R methodApply(BiFunction<T, U, R> function, T argOne, U argTwo) { 
     return function.apply(argOne, argTwo); 
    } 

} 

出力:ここ

があることを示すサンプル動作するコードです、リスト= [こんにちはワールド]

除去、リストのafer = []


BiFunctionそれが必要としての機能が '、意味をなさない

ストリング=ハロー


関連する問題