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

一般问题是:

  • 使用语法object::aMethod ,是否可以将其转换为MethodHandle等类型作为function接口?
  • 如果不是,如果可能的话,如何在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但限制性很强。 正如这个答案提到的那样,在版本b75之前,有一个java.util.function.Block可用并且可能很方便。

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

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

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

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