You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:53:34