Это не компилируется:
trait FileSystem {
type P <: Path[this.type]
}
trait Path[S <: FileSystem] { self: fileSystem.P =>
val fileSystem: S
}
Как ограничение собственного типа может зависеть от члена-значения в этом свойстве?
Это не компилируется:
trait FileSystem {
type P <: Path[this.type]
}
trait Path[S <: FileSystem] { self: fileSystem.P =>
val fileSystem: S
}
Как ограничение собственного типа может зависеть от члена-значения в этом свойстве?
Не может (и не уверен, что бы это значило).
trait FileSystem {
type P <: Path[this.type]
}
trait Path[S <: FileSystem] { self: S#P =>
val fileSystem: S
}
self
был экземпляром зависимого типа в fileSystem.P
. Таким образом, ограничения собственного типа могут относиться только к типам в списке параметров универсального типа, а не к элементам типа или зависимым типам в элементах-значениях?
- person Tongfei Chen; 18.11.2016
val
, который фиксируется во время инициализации, а не от var
.
- person Tongfei Chen; 18.11.2016
Ну, я бы не стал этого делать, но вы можете; просто поместите 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
}