类继承(extends)与隐式类的差异:我的理解是否有误?
你观察到的「两者都能访问父类及自身方法」只是表面现象,底层逻辑和使用场景完全不同,核心区别如下:
本质关系差异
子类继承(class Child extends Parent)是is-a关系:Child本身就是Parent的子类型,它拥有Parent的所有属性和方法,同时可以扩展自己的内容。
隐式类(implicit class Child(a: Parent))是has-a关系:Child是一个包装类,内部持有Parent的实例,它和Parent没有继承关系,只是编译器会自动把Parent实例转换成Child实例,让你能调用Child的方法。类型兼容性不同
子类实例可以直接赋值给父类类型的变量:val p: Parent = new Child()完全合法,因为Child是Parent的子类型。
隐式类实例和Parent是完全不同的类型,不能直接赋值:val p: Parent = new Child(parentInst)会编译报错,只有在调用隐式类特有的方法时,编译器才会自动触发Parent到Child的转换。方法访问的底层逻辑
子类调用父类方法时,是直接继承来的,相当于自己的方法;调用自身方法时,就是执行子类自己的实现。
隐式类中调用Parent的方法,必须通过内部持有的a实例(比如a.parentMethod());而隐式类自己的方法,是属于Child这个包装类的,只有当Parent实例调用这些方法时,编译器才会临时把Parent转成Child来执行。使用场景天差地别
子类继承用于扩展类型的核心行为,适合需要长期复用、属于类型本身职责的功能,是面向对象设计中「继承多态」的实现方式。
隐式类用于给现有类型临时扩展方法,不需要修改原类代码,也不需要继承,适合快速给第三方类(比如Java的String、List)添加辅助功能,属于Scala的「语法糖」特性。
内容的提问来源于stack exchange,提问作者Lenny

