java - 在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 和函数式接口是可能的,但并不完全清楚如何放置它。
解决方案
函数式接口方法需要接受一个与命名类相同类型的参数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
推荐阅读
- laravel - 自定义 Laravel Nova 破坏性动作模式
- c++ - 在 C++20 中混合模块和头文件是否可能/可接受?
- python - Python:十六进制字符串到图像的转换?
- r - ksmooth 函数不能通过省略号处理参数
- javascript - 无序列表 unicode 字符 0x25E6 填充问题
- python-3.x - TypeError: AnonimousSurvey() 接受 0 个位置参数,但给出了 1 个
- python - PIP --upgrade 不适用于 Python 3.8.2
- c++ - qt删除窗口顶部框架边框
- c - 如何为 openssl 解密命令提供字符串 IV 和密钥?
- reactjs - 反应错误说对象作为反应子无效