下面的代码片段有什么问题,这与钻石问题有关吗?当我试图用D的示例调用函数func时,我面临运行时错误
trait B{
def func(): Unit = {
println("Inside class B")
}
}
trait C{
def func(): Unit = {
println("Inside class C")
}
}
class D extends B with C{
}
object ABC extends App{
val ob = new D
ob.func()
}
字符串
1条答案
按热度按时间fae0ux8s1#
好吧,正如所写的那样,
B.func
和C.func
是 * 不相关的 *,所以当你执行D extends B with C
时,它最终会有两个同名的不相关成员-这就是错误。解决这个问题的一个天真的尝试是添加一个共同的父节点:
字符串
令人惊讶的是,这也不能编译(在我看来这是编译器中的一个bug),但是如果你只是在声明中添加
override
(这不是必需的,* 应该 * 不会有任何区别),* 那么 * 它会:🤷型
更新好吧,也许,我需要放松一下我对“编译器中的bug”的咆哮,并将其降级为“模糊和怪异的行为”:)在这种情况下,似乎只有
C
中的声明需要override
,B
可以没有.D
中的C
的func
覆盖了具体的实现(来自B
),这使得override
是必需的.如果编译器错误实际上提到了这一点,我愿意更进一步,把“晦涩和怪异的行为”降级为“不必要的样板要求”:)