1

嗨,是否可以在 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
}
4

4 回答 4

4

不,但您可以传递对象本身:

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();
    } 
}
于 2012-06-03T07:50:59.950 回答
1

在java中不使用反射是不可能定义函数指针的。

您可以使用反射(请参见java.lang.reflect.Method类)在某种程度上模仿这种行为,但总的来说,这段代码听起来很奇怪(虽然也许我没有得到什么;))

于 2012-06-03T07:54:09.293 回答
0

您不能传递函数指针。最简单的方法是将方法封装在接口中,并传递实现该接口的对象而不是函数引用。

于 2012-06-03T07:52:18.030 回答
0

您正在寻找的是一流的功能。您的示例需要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 中的样子:

您是否希望在此工具提示中找到一个笑话?

于 2012-06-03T08:23:59.817 回答