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.
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.