一般问题是:
object::aMethod
时,是否可以将其转换为MethodHandle
类型作为功能接口?举个例子,假设我们希望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专家:请根据需要优化问题的标题。
答案 0 :(得分:8)
我认为没有办法做你想做的事。 WHATTYPE必须是一个功能界面 - 不一定是Function
,而是一个单一抽象方法匹配somemethod
的界面。它是一种普通的接口类型,遵循管理Java类型的通常规则。 java.util.function.Block
是一个像这样的普通接口类型,并不像你想象的那样特别。 (顺便说一下,它现在仍然在称Consumer
。)
答案 1 :(得分:5)
方法引用就像lambda一样,就像lambda一样,它本身没有“type”。它的类型取决于使用它的上下文。所以你的问题没有意义。如果在调用此MethodRefRunner.execute()
方法时使用方法引用,那么方法引用的类型将 WHATTYPE
的实例(无论是什么),因为那是声明接受的方法是什么。如果你从其他地方拿到它,那么那个地方就会知道它是什么类型。