多次混合相同特性的规则

ayv*_*ngo 2 scala mixins

我试图编写一些抽象代码,使其逐步变得更加复杂.它已经破坏了其中一个步骤.

第一步,正确

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继承了特征数据的不同类型实例

这个错误意味着什么,有没有办法绕过它?

Kip*_*ros 6

完整的错误消息是

[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单独的名称是不明确的,它可以引用对象的特征.但是,当提到一个类型时,"." 或"#"符号消除歧义:

  1. T#Data始终表示Data类型中的类型 成员T.例如,BaseHolder#Data将指的是特征BaseHolder.

  2. x.Data始终表示对象中Data类型成员.例如,将指的是单例对象. xBaseHolder.DataBaseHolder

需要注意的是两个实例xytrait BaseHolder都会有不同的类型x.Datay.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)

  • 很难回答一个相当困难的问题.如果你跟上它,你会让我和雷克斯破产!;-) (2认同)