如何在Java 8中间接运行方法引用?

时间:2013-06-17 08:16:55

标签: java lambda java-8

一般问题是:

  • 使用语法object::aMethod时,是否可以将其转换为MethodHandle类型作为功能接口?
  • 如果不是,如果可能的话,如何在Java 8中间接调用方法引用?

举个例子,假设我们希望MethodRefRunner为:

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,但限制性很强。正如this answer提到的那样,在版本b75之前,有一个java.util.function.Block可用并且可能很方便。

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

注意给Java专家:请根据需要优化问题的标题。

2 个答案:

答案 0 :(得分:8)

我认为没有办法做你想做的事。 WHATTYPE必须是一个功能界面 - 不一定是Function,而是一个单一抽象方法匹配somemethod的界面。它是一种普通的接口类型,遵循管理Java类型的通常规则。 java.util.function.Block是一个像这样的普通接口类型,并不像你想象的那样特别。 (顺便说一下,它现在仍然在称Consumer。)

答案 1 :(得分:5)

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