Допустим, у меня есть:
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 = ???
}
Таким образом, экземпляры XDependent
имеют доступ к значению T.x
, при этом 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 существует четкое разделение между типами и значениями.
Теперь я натолкнулся на идеи зависимых от значения типов и литеральных типов . Я хочу знать, имеет ли идея «статическое значение для типов», как показано выше, много общего с этими понятиями и каковы связи.
Я также хотел бы узнать о различных подходах, применяемых на разных языках, о стирании различий между типами и значениями, о том, насколько они совместимы с системой типов Scala, и каковы сложности с точки зрения интеграции «статических значений» с системой типов. то есть, (могут ли они быть) / (что произойдет, если они) переопределены подтипом и т. д.