Java 中的方法引用如何解析

How does the method reference resolve in Java

Function<String, Integer> f = Integer::new;

Integer i = f.apply("100");

当我们调用 f.apply 时,如何使用 Integer.parseInt

apply 来自 Java 8 的 Function class.

R apply(T t)

Applies this function to the given argument.

Parameters: t - the function argument Returns: the function result

首先,这不是一个方法引用,它是一个 lambda。

您可能想做的是 Function<String, Integer> f = Integer::parseInt

Java 编译器将该 lambda 表达式转换为 Function 对象,其中 apply 方法被 lambda 中的内容覆盖。 Lambda 表达式基本上是语法糖,用于创建只有一种方法的接口实例(它们称为函数式接口)。出于所有意图和目的,lambda 被扩展为:

class FunctionImpl extends Function<String, Integer> {
  @Override
  public Integer apply(String s) {
    return new Integer(s); //which calls Integer.parseInt(s) internally
  }
}
Function f = new FunctionImpl();

但是,在实际的字节码中,生成了一个新方法和一个调用该方法的名为 invokevirtual 的特殊操作码。

我猜你的问题是:"How does javac know to invoke parseInt here"?

您的代码段已损坏;仿制药掉下来了。照原样,您的代码将无法编译,因为引用不明确。如果你重新添加它,它将正常编译和工作:

Function<String, Integer> f = Integer::new;
Integer i = f.apply("100");

忘记新的 :: 语法或 Function 部分;他们是红鲱鱼。

所以让我们简化一下:

Integer i = new Integer("100");

有效java;我最终会持有 100 的价值。

之所以有效,是因为...该构造函数存在。它被指定精确地作为 Integer.parseInt 的基数为 10 作品,并且它被弃用,有两个很好的理由: [A] 调用 new Integer() ,任何值,都被弃用(使用 Integer.valueOf), [B] 只需调用 parseInt.