Я пытаюсь выставить класс, параметризованный с псевдонимом типа:
trait Tr[T] {
var x: T = _
}
abstract class Foo {
type MyParameter
class SomeClass extends SomeOtherClass with Tr[MyParameter]
}
class Bar extends Foo {
override type MyParameter = Int
val myObj = new SomeClass
myObj.x = 6
}
class Qux extends Foo {
override type MyParameter = String
val myObj = new SomeClass
myObj.x = "hello"
}
Это отлично работает.
Теперь я хотел бы указать значение по умолчанию для типа MyParameter
. Как это:
abstract class Foo {
type MyParameter = String
// ...
}
// ...
class Qux extends Foo {
val myObj = new SomeClass
myObj.x = "hello"
}
Однако, если я сделаю это, класс Bar
потерпит неудачу с ошибкой типа - очевидно, в этот момент SomeClass
уже зафиксирован в String
.
Что я могу сделать, чтобы это исправить? Альтернативно, какой другой подход я могу использовать для параметризации SomeClass
типом, который имеет значение по умолчанию, но может быть переопределено в подклассах Foo
?
Обратите внимание, что SomeClass
будет более сложным, чем показано, поэтому я не хочу, чтобы пользователям приходилось переопределять определение SomeClass
. Кроме того, все варианты использования X.SomeClass
должны использовать один и тот же Tr[T]
, поэтому я не хочу делать SomeClass
параметрируемым.