Java 8方法引用:String::new对应String类的哪个方法?
解答你的Java方法引用问题
嘿,这个问题问到点子上了,咱们一步步拆解来搞清楚:
1. 执行的是String类的哪个方法?
你代码里的String::new这个方法引用,匹配的是String类里的单参数构造方法:
public String(String original)
这个构造方法的作用是接收一个String参数,创建并返回一个新的String对象(不过由于String的不可变性,实际传入字符串字面量时会复用常量池中的对象,但逻辑上确实调用了这个构造方法)。
2. Java运行时是否提供默认实现?
并没有。这里的逻辑是方法引用直接绑定到了String的对应构造方法,Java运行时只是帮你做了方法引用和函数式接口的适配工作——因为你的HelloWorld是一个函数式接口(只有一个抽象方法hello(String s)),它的方法签名(String) -> String刚好和String的单参数构造方法签名匹配,所以可以直接用String::new来赋值给这个接口的实例。
3. 是否默认调用了Supplier.get()方法?
完全不是。Supplier是一个无参的函数式接口,它的get()方法签名是() -> T,而你的HelloWorld.hello()方法是接收一个String参数的,两者签名完全不匹配,所以和Supplier没有任何关系。这里是直接适配了你自定义的HelloWorld接口。
补充一点小知识
方法引用类名::new的匹配规则是:Java会根据上下文(也就是你要赋值的函数式接口的抽象方法签名),自动寻找类中对应的构造方法——如果接口方法无参,就匹配无参构造;如果接口方法有一个参数,就匹配对应参数类型的构造方法,以此类推。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

