给出两个独立的特征:
trait T1 { def x = 42 } trait T2 { def x = 0 }
class C extends T1 with T2
我收到编译器错误:
error: overriding method x in trait T1 of type => Int; method x in trait T2 of type => Int needs `override' modifier class C extends T1 with T2 ^ one error found
现在假设T1和T2是独立开发的,因此没有覆盖,因为它们不会覆盖任何东西.那怎么可以定义C?像这样:
class C extends T1 with T2 { override def x = super.x }
?
解决方法
这被称为
diamond problem.在Scala中有两种方法可以解决这个问题:
trait T1 { def x = 0 } trait T2 { def x = 42 } class C extends T1 with T2 { override def x = super.x } class D extends T2 with T1 { override def x = super.x }
如果你现在调用新的C().x,你会得到42,因为Scala使用你最后混合的特征的实现.新的D().x将顺便产生0.这意味着,为了解决钻石问题,您必须明确定义要使用的实现.
另一种方式如下:
trait T { def x: Int } trait T1 extends T { override def x = 0 } trait T2 extends T { override def x = 42 } class C extends T1 with T2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。