首页 > 解决方案 > 在Java中将任何方法作为参数传递的功能接口

问题描述

我正在尝试编写一个接受 2 个参数的方法 - 一个类引用和该类中方法的引用。方法本身的返回类型应该是该类的方法返回类型。例如:

public <T> T myMethod (Class<?> c, <reference to a method m in class c>), where m returns something of type <T>.

也就是说,在我的代码中,我应该能够将上述方法称为:

myMethod (SomeClass.class, x -> x.someMethod(param1, param2))

请注意,它SomeClass可以是任何类,并且someMethod可以是该类中具有任意数量参数的任何方法。

我有理由确定在 Java 8 中使用 lambda 和函数式接口是可能的,但并不完全清楚如何放置它。

标签: javamethodslambdafunctional-programming

解决方案


函数式接口方​​法需要接受一个与命名类相同类型的参数c,因此您需要为该类定义一个泛型类型,让我们调用它C

函数式接口方​​法需要返回一个 type 的值T,但是让我们重命名它R来表示返回类型。

这意味着你的函数接口可以是:Function<C, R>

您的完整方法声明是:

public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method)

它可以像你展示的那样被调用。

演示

public class Test {
    public static void main(String[] args) throws Exception {
        Test t = new Test();
        String param1 = "Foo", param2 = "Bar";

        String result = t.myMethod(SomeClass.class, x -> x.someMethod(param1, param2));

        System.out.println(result);
    }
    public <C, R> R myMethod(Class<? extends C> clazz, Function<C, R> method) throws Exception {
        C obj = clazz.getConstructor().newInstance();
        return method.apply(obj);
    }
}

class SomeClass {
    public SomeClass() {}
    public String someMethod(String param1, String param2) {
        return param1 + " + " + param2 + ": " + this;
    }
}

输出

Foo + Bar: test.SomeClass@5594a1b5

推荐阅读