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

nob*_*beh 10 java lambda java-8

一般问题是:

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

举个例子,假设我们想要一个MethodRefRunner:

class MethodRefRunner {
  static void execute(Object target, WHATTYPE mref, Object... args) {
    mref.apply(args);
  }
}
Run Code Online (Sandbox Code Playgroud)

它可以用作: MethodRefRunner.execute(o, o::someMethod, someParam)

在上面的代码片段中,一个选项WHATTYPEjava.util.function.Function非常严格的.正如这个答案提到的那样,在版本b75之前,有一个java.util.function.Block可用的并且可能很方便.

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

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

Mau*_*lin 8

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


new*_*cct 5

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