11

一般问题是:

  • 使用语法object::aMethod时,能不能转换成MethodHandle函数式接口之类的类型?
  • 如果不是,如果可能的话,如何在 Java 8 中间接调用方法引用?

例如,假设我们想要一个MethodRefRunneras:

class MethodRefRunner {
  static void execute(Object target, WHATTYPE mref, Object... args) {
    mref.apply(args);
  }
}

它可以用作:MethodRefRunner.execute(o, o::someMethod, someParam)

在上面的代码片段中,一个选项WHATTYPE非常java.util.function.Function严格。正如这个答案所提到的,在 b75 版本之前,有一个java.util.function.Block可用的并且可能很方便。

另一方面,任何WHATTYPE可能以某种方式转换为java.lang.invoke.MethodHandle?

Java 专家注意事项:请根据需要细化问题的标题。

4

2 回答 2

9

我不认为有任何方法可以做你想做的事。WHATTYPE 必须是一个函数式接口——不一定Function,但它的单个抽象方法匹配somemethod。它是一个普通的接口类型,受制于管理 Java 类型的常用规则。 java.util.function.Block是一个像这样的普通接口类型,并不像你想象的那样特别。(顺便说一句,它仍然存在,现在称为Consumer。)

于 2013-06-17T11:25:50.517 回答
5

方法引用就像 lambda 一样工作,并且和 lambda 一样,它本身没有“类型”。它的类型取决于使用它的上下文。所以你的问题真的没有意义。如果您在调用此MethodRefRunner.execute()方法时使用方法引用,则方法引用的类型将是(无论是什么)的一个实例WHATTYPE,因为这是该方法被声明接受的。如果你从其他地方得到它,那么那个地方会知道它是什么类型的。

于 2013-06-17T23:40:10.433 回答