【发布时间】:2013-06-18 07:40:10
【问题描述】:
一般问题是:
- 在使用
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)
在上面的 sn-p 中,WHATTYPE 的一个选项是java.util.function.Function,但非常严格。正如this answer 提到的,在b75 版本之前,有一个java.util.function.Block 可用并且可能很方便。
另一方面,WHATTYPE 是否有可能以某种方式转换为java.lang.invoke.MethodHandle?
注意 Java 专家:请根据需要细化问题的标题。
【问题讨论】:
-
在Scala中,你可以将一个方法强制转换成一个函数值,这就是eta扩展(有Scala 中 method 和 function 之间的区别)。至于您描述的情况,Scala 编译器足够聪明,可以同时接受这两种情况。
-
@Beryllium 确实有很好的对比,这也是为什么我想知道 Java 8 没有选择它的原因。
-
@nobeh Java 8 坚持使用函数式接口,因为添加函数类型会涉及到对语言的更大更改。他们可能会晚点来。
-
@nobeh 这太糟糕了。他们应该重新考虑在下次更新中添加功能类型