我试图编写一些抽象代码,使其逐步变得更加复杂.它已经破坏了其中一个步骤.
第一步,正确
trait Base
trait C1 extends Base
trait Abst extends Base
trait Conc extends Abst with C1
Run Code Online (Sandbox Code Playgroud)
第二步,正确
object BaseHolder {
trait Data
}
object C1Holder {
trait Data extends BaseHolder.Data
}
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data
Run Code Online (Sandbox Code Playgroud)
第3步,越野车错误
trait BaseHolder {
trait Data
}
object BaseHolder extends BaseHolder
trait C1Holder extends BaseHolder {
trait Data extends super.Data
}
object C1Holder extends C1Holder
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data
Run Code Online (Sandbox Code Playgroud)
我有错误:非法继承; trait Con继承了特征数据的不同类型实例
这个错误意味着什么,有没有办法绕过它?
完整的错误消息是
[error] trait Conc inherits different type instances of trait Data:
[error] C1Holder.Data and BaseHolder.Data
[error] trait Conc extends Abst with C1Holder.Data
[error] ^
[error] one error found
Run Code Online (Sandbox Code Playgroud)
它说这(object BaseHolder).Data
是不一致的,(object C1Holder).Data
因为虽然后者符合(trait BaseHolder)#Data
,但这不像trait Data
单身实例那样具体object BaseHolder
.
编辑.请注意,类型和值存在于不同的名称空间中,因此BaseHolder
单独的名称是不明确的,它可以引用对象的特征.但是,当提到一个类型时,"." 或"#"符号消除歧义:
T#Data
始终表示Data
类型中的类型 成员T
.例如,BaseHolder#Data
将指的是特征BaseHolder
.
x.Data
始终表示对象中的Data
类型成员.例如,将指的是单例对象. x
BaseHolder.Data
BaseHolder
需要注意的是两个实例x
和y
中trait BaseHolder
都会有不同的类型x.Data
和y.Data
; 这是路径依赖类型的工作方式.另请注意,这object BaseHolder extends BaseHolder
只是一个特定的实例trait BaseHolder
.
要使代码编译,请确保(trait C1Holder)#Data
实际符合(object BaseHolder).Data
trait BaseHolder {
trait Data
}
object BaseHolder extends BaseHolder
trait C1Holder extends BaseHolder {
trait Data extends BaseHolder.Data // Here BaseHolder refers to singleton object
}
object C1Holder extends C1Holder
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data
Run Code Online (Sandbox Code Playgroud)
在这个例子中,特征没有做太多,所以你可能想要一试
object BaseHolder {
trait Data
}
object C1Holder {
trait Data extends BaseHolder.Data
}
trait Abst extends BaseHolder.Data
trait Conc extends Abst with C1Holder.Data
Run Code Online (Sandbox Code Playgroud)