Чтобы избежать необходимости повторять информацию о параметрах типа при создании подклассов параметризованных классов, я пытаюсь переписать некоторый код для использования абстрактных типов.
То, что я хотел бы выразить, похоже на:
class Group[A]
abstract class Thing[A, G <: Group[A]] {
val group: G
}
class SomeGroup[A] extends Group[A] { g =>
object SomeThing extends Thing[A, SomeGroup[A]] {
val group = g
}
}
Используя абстрактные типы, моя лучшая попытка на данный момент:
class Group {
type A
}
abstract class Thing { t =>
type A
type G <: Group { type A = t.A }
val group: G
}
class SomeGroup extends Group { g =>
object SomeThing extends Thing {
type A = g.A
type G = SomeGroup { type A = g.A }
val group = g
}
}
Однако в последней строке я получаю сообщение об ошибке компилятора, в котором говорится, что «группа значений имеет несовместимый тип».
Как написать первый пример, используя абстрактные типы?