为何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
相关产品推荐
相关产品推荐

