Scala中下述继承代码存在什么问题?是否涉及菱形问题?
Scala代码问题分析:多重Trait混入的方法冲突
代码存在的问题
这段代码里,类D同时混入了Trait B和C,而这两个Trait都实现了签名完全一致的func()方法。当D没有显式重写这个方法时,编译器无法确定应该调用哪个Trait的func()实现,会直接抛出方法引用歧义的错误(注:实际是编译阶段报错,并非运行时错误)。
是否与菱形问题相关?
不属于传统的菱形问题。
传统菱形问题的场景是:类A有一个方法,类B和C都继承自A并重写了该方法,类D同时继承B和C,此时调用D的该方法会因为继承路径的歧义产生问题。而这里的B和C是两个独立的Trait,没有共同的父类实现func()方法,只是恰好都定义了同名同签名的方法,属于多重Trait混入时的方法冲突,和菱形问题的成因不同。
解决方法
在类D中显式重写func()方法,明确指定要调用哪个Trait的实现,或者自定义逻辑:
class D extends B with C{ override def func(): Unit = { super[B].func() // 选择调用B的实现,换成super[C]则调用C的实现 // 也可以自定义逻辑:println("Inside class D") } }
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

