2016-06-11 22 views
1

私はClassMethodの両方をパラメータとしてメソッドに渡す方法を検討しています。繰り返したいコードを繰り返しています。クラスとメソッドをパラメータとして渡す

public static void methodName(Class C, Method m) {   
    C.m.sendKeys("item");      
} 

はこれが可能である:

私はこのような何かをしたいですか?

答えて

0

はい、これにはConsumer<...>を使用できます。例えば:ここで、

MyClass mc = new MyClass(); 
methodName(mc::methodToPass); 

または、BiConsumer<...>を使用して:これはまた、構文を使用してインスタンスメソッド、のために働く

methodName(MyClass::methodToPass); 

class MyClass { 
    public static void methodToPass(String arg) {...} 
} 

public static void methodName(Consumer<String> cons) { 
    cons.accept("item"); 
} 

は次にように呼び出します最初の引数が渡される場合は、メソッドを呼び出すインスタンスでなければなりません:

methodName(MyClass::methodToPass); 
public static void methodName(BiConsumer<MyClass, String> cons) { 
    MyClass mc = ...; 
    cons.accept(mc, "item"); 
} 

これは、限り、あなたが呼び出しているメソッドは、Consumer<...>の型パラメータとして指定したタイプの一つの引数を取るように動作します。

Consumer<...>のような利用可能なインターフェイスが、java.util.functionパッケージのさまざまな種類のメソッドに対応しています。

1

Java 8では、ラムダとして渡されたメソッド参照を使用できます。

methodName(C::m); 

あなたは、関数の型(引数と戻り値)を指定し、既存の機能のインタフェースのいずれかを使用するか、独自に定義する必要があります。

あなたの関数はブール値を返し、入力として、クラスTのオブジェクトを受け取りたとえば場合は、事前に定義された機能的なインターフェースPredicate使用することができます。java 8で

public static void methodName(Item item, Predicate<Item> p) { 
    p.test(item); 
    // ... 
} 
+0

ないが、あなたは匿名の実装とのインターフェイスを渡すことができます初期バージョン – Benedictus

関連する問題