假设我有:
trait X {
val x: String
}
使用混合,我可以定义一个特征,例如
trait XPrinter {
self: X =>
def printX: String = "X is: " + x
}
这样一个值/对象实现XPrinter
实施x
并给出其方法,例如printX
访问指定的值X
例如x
.
到目前为止,一切都很好。
我想知道是否有一种方法可以具有以下形式的特征:
trait XDependent[T <: X] {
def printX: String = ???
}
So that XDependent
实例可以访问以下值T.x
, with x
假定为与类型定义粘合的“静态值”。
现在我明白为什么T.x
无法访问XDependent
因为类型子类型 X 甚至不必实现x
T.x 可能是抽象的。
据我了解,虽然 Scala 提供了路径依赖类型,因此 X 中定义的抽象类型可以用于XDependent
,如下所示:
trait X {
type Y //which can be constrained as desired.
}
trait XDependent[T <: X]{
def foo(v:T#Y)
def bar: T#Y
}
它不提供与值相同的东西,因为 Scala 中类型和值之间有明显的分离。
现在我想到了值依赖类型 and 基于文字的类型。我想知道“类型的静态值”的想法(如上所示)是否与这些概念有很多重叠以及它们之间的联系。
我还想了解不同语言中采用的不同方法,以模糊类型和值之间的分离,它们与 Scala 类型系统的兼容性如何,以及将“静态值”与类型集成方面的复杂性-系统。即,(它们可以)/(如果它们是的话会发生什么)被子类型覆盖,等等。