Java8函数式接口疑问:Car::new究竟创建了何种实例?
关于
Rideable rider = Car :: new的疑问解答 嘿,这个问题其实是Java里方法引用和函数式接口结合的典型场景,我来一步步给你讲明白:
1. 这条语句创建的是Rideable接口的实例,而非Car对象
Rideable rider = Car :: new 其实是用方法引用的方式,创建了Rideable这个函数式接口的实现实例。它并没有直接生成Car类的对象,而是把Car的构造方法和Rideable的抽象方法做了适配。
因为Rideable被标注为@FunctionalInterface,意味着它只有一个抽象方法getCar(String name),所以我们可以用方法引用或者Lambda表达式来快速实现这个接口,而不用写一个单独的实现类。
2. 为什么没有无参构造代码还能合法运行?
这里的关键是:Car::new引用的不是无参构造方法,而是你定义的那个带String参数的构造方法Car(String name)!
我们来看方法签名的匹配:
- Rideable的抽象方法:
Car getCar(String name)→ 接收一个String参数,返回Car对象 - Car的带参构造:
Car(String name)→ 接收一个String参数,返回Car对象(构造方法的“返回值”就是创建的实例)
两者的签名完全匹配,所以Java会自动把这个带参构造方法适配成Rideable接口的实现。当你调用rider.getCar("MyCar")时,本质上就是在调用new Car("MyCar"),完全符合Car类的构造要求,自然不会报错。
如果把这段代码转换成等价的Lambda表达式,你会更容易理解:
Rideable rider = (name) -> new Car(name);
Car::new就是这个Lambda的语法糖,功能完全一致。
反过来想,如果Rideable的抽象方法是无参的:
@FunctionalInterface interface Rideable { Car getCar(); }
这时候再写Rideable rider = Car::new就会编译报错了,因为Java会去寻找Car的无参构造方法,而你的代码里并没有定义它。
内容的提问来源于stack exchange,提问作者Patrick C.
相关产品推荐
相关产品推荐

