Scala自我类型与依赖键入

时间:2016-11-17 22:00:20

标签: scala dependent-type self-type

这不编译:

trait FileSystem {
    type P <: Path[this.type]
}

trait Path[S <: FileSystem] { self: fileSystem.P =>
    val fileSystem: S
}

自我类型约束如何依赖于该特征中的值成员?

2 个答案:

答案 0 :(得分:4)

它不能(并且不确定它意味着什么)。

trait FileSystem {
    type P <: Path[this.type]
}

trait Path[S <: FileSystem] { self: S#P =>
    val fileSystem: S
}

答案 1 :(得分:1)

嗯,我不会这样做,但你可以;只需将Path 放入 FileSystem

trait AnyPath[S <: FileSystem] { self: S#P =>
  val fileSystem: S
}

trait FileSystem { thisFileSystem =>
  type P <: Path
  trait Path extends AnyPath[thisFileSystem.type]{ self: thisFileSystem.P =>
    lazy val fileSystem = thisFileSystem
  }
}

case object SomeFileSystem extends FileSystem {
  type P = ReallyConcretePath
  case class ReallyConcretePath() extends Path
}