【问题标题】:How to pass a non static method from a specific class as parameter to Function如何将特定类中的非静态方法作为参数传递给函数
【发布时间】:2021-05-02 13:56:39
【问题描述】:
这在 C++ 中是等价的,我想传递非静态函数和 Foo 的唯一方法:
class Foo
{
public:
double method1 ()
{
return 1.0;
}
unsigned char method2 ()
{
return 2;
}
};
template <typename T>
T myMethod (T (*methodFromFoo) (void))
{
return methodFromFoo ();
}
myMethod 的返回类型必须是通用的,因为我想要包装不同返回类型的方法。
java 11 中的语法是什么?
【问题讨论】:
标签:
java
methods
parameters
【解决方案1】:
根据方法的类型而有所不同。您需要阅读 Java 中的 Lambda's, Method references, and Functional Interfaces。
在您的示例中,供应商可以工作。
import java.util.function.Supplier;
public class PassingMethods {
public static void main(String[] args) {
PassingMethods pm= new PassingMethods();
Foo foo = new Foo();
pm.getVal(foo::method1);
pm.getVal(foo::method2);
}
public <T> void getVal(Supplier<T> sup) {
System.out.println(sup.get());
}
static class Foo
{
double method1 ()
{
return 1.0;
}
char method2 ()
{
return 'a';
}
}
}
打印
1.0
a
我将 char 返回更改为返回 'a'。
【解决方案2】:
这在 java 中由函数式接口处理。由于您的方法不带参数并返回一个值,因此等效的 java 语法是 Supplier<T>。
所以,结果方法是:
public <T> static T myMethod(final Supplier<T> supplier) {
return supplier.get();
}
并通过传入适当的Supplier<T> 来调用它。
例如:
public void invokeWithInlineLambda() {
final int result = myMethod(() -> 10); // result = 10
}
public void invokeFromMethod() {
final String result = myMethod(this::getResult); // result = "Meow"
}
private String getResult() {
return "Meow";
}