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

为何LambdaExpressionExample2类未实现Drawable函数式接口?

解答你的问题

Great question! Let's break this down clearly:

1. 为什么LambdaExpressionExample2不需要实现Drawable接口?

你要明白Lambda表达式的核心作用:它是函数式接口的匿名实现实例,而不是让包含它的类去实现接口。

在你的代码里:

  • Drawable是一个函数式接口(只有一个抽象方法draw(),@FunctionalInterface注解只是显式声明,可选)。
  • 这行代码Drawable d2 = ()->{ System.out.println("Drawing "+width); };本质上是用Lambda语法,直接创建了一个Drawable接口的匿名实现对象,把它赋值给变量d2。
  • LambdaExpressionExample2这个类本身不需要实现Drawable,因为我们根本没让这个类去扮演Drawable的角色——只是在它的main方法里,临时创建了一个Drawable的实例来使用而已。

2. 这属于组合关系吗?

答案是不属于。

组合关系的定义是:一个类(比如A)持有另一个类/接口(比如B)的实例作为自己的成员变量,A和B是“整体-部分”的关系,B的生命周期通常和A绑定。

而你的代码里,Drawable的实例d2是main方法的局部变量,LambdaExpressionExample2类并没有把Drawable作为自己的成员属性来持有,只是在方法内部临时创建并使用了这个实例,所以完全不符合组合的特征。

如果要改成组合关系,代码会是这样的:

@FunctionalInterface
interface Drawable{
    public void draw();
}
public class LambdaExpressionExample2 {
    // 类持有Drawable实例作为成员变量——这才是组合
    private Drawable drawable;

    // 通过构造方法传入Drawable实例
    public LambdaExpressionExample2(Drawable drawable) {
        this.drawable = drawable;
    }

    public void performDraw() {
        drawable.draw();
    }

    public static void main(String[] args) {
        int width=10;
        // 创建Lambda实现的Drawable实例,传入LambdaExpressionExample2
        LambdaExpressionExample2 example = new LambdaExpressionExample2(() -> {
            System.out.println("Drawing "+width);
        });
        example.performDraw();
    }
}

这样LambdaExpressionExample2和Drawable才是组合关系,因为前者持有后者的实例作为自己的一部分。


内容的提问来源于stack exchange,提问作者Shubbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:12:33