嗨,是否可以在 JAVA 中实现函数指针我正在尝试做这样的事情
void methodA
{
try
{
}
catch(Exception E)
{
methodB(Pass the function pointer pointing to methodA)
}
}
void methodB(fp some_function_pointer)
{
call some_function_pointer
}
嗨,是否可以在 JAVA 中实现函数指针我正在尝试做这样的事情
void methodA
{
try
{
}
catch(Exception E)
{
methodB(Pass the function pointer pointing to methodA)
}
}
void methodB(fp some_function_pointer)
{
call some_function_pointer
}
不,但您可以传递对象本身:
public class Foo {
void methodA() {
try {
}
catch(Exception e) {
bar.methodB(this)
}
}
}
public class Bar {
void methodB(Foo someFoo) {
someFoo.methodA();
}
}
如果您希望能够传递任何方法,请将此方法包装到 Runnable 或 Callable 中,例如:
public class Foo {
void methodA() {
try {
}
catch(Exception e) {
bar.methodB(new Runnable() {
@Override
public void run() {
Foo.this.methodA();
}
});
}
}
}
public class Bar {
void methodB(Runnable runnable) {
runnable.run();
}
}
在java中不使用反射是不可能定义函数指针的。
您可以使用反射(请参见java.lang.reflect.Method类)在某种程度上模仿这种行为,但总的来说,这段代码听起来很奇怪(虽然也许我没有得到什么;))
您不能传递函数指针。最简单的方法是将方法封装在接口中,并传递实现该接口的对象而不是函数引用。
您正在寻找的是一流的功能。您的示例需要methodA
是一流的功能,所以让我们将其更改为。
下面的类表示具有 arity 0 的第一类函数(一种正式的说法,它不带参数)。
abstract class F0<A> {
public abstract A apply();
}
使用它,您的代码可以重写为:
F0<Void> methodA = new F0<Void>() {
@Override
public Void apply() {
try {
// failable actions
} catch (Exception ex) {
methodB(methodA);
}
return null;
}
};
void methodB(F0<Void> methodA) {
methodA.apply();
}
切线:
我承认上面的代码看起来有点过于粗糙,但是诸如 IntelliJ IDEA 之类的 IDE 提供了他们所谓的“闭包折叠”,这使得这些代码看起来更好一些。例如,看看这段代码在我的 IDE 中的样子: