如何在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
的实例(无论是什么),因为这是声明接受的方法。 如果你从其他地方拿到它,那么那个地方就会知道它是什么类型的。