У меня есть черта, которая принимает тип параметра, и я хочу сказать, что объекты, которые реализуют эту черту, также соответствуют этому параметру этого типа (с использованием универсальных совместимости)
Следующий код:
trait HandleOwner[SELF <: HandleOwner[SELF]] {
self : SELF =>
// ...
def handle: Handle[SELF]
}
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
// ...
}
дает мне следующую ошибку:
illegal inheritance; self-type test.Common[SELF] does not conform to
test.HandleOwner[SELF]'s selftype SELF
, если я измените общих для:
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
self : SELF =>
// ...
}
, то ошибка исчезает.
Почему я должен повторить одну и ту же декларацию в каждом небетонном типе. Если бы у меня был базовый класс, и скажем, «расширяется сопоставимым», мне не нужно повторять «расширение сопоставимы» в каждом полученном типе, до тех пор, пока бетонные классы реализуют метод сравнения. Я думаю, что это должно быть то же самое здесь. Я просто говорю, что тип расширяющегося типа также будет также self, и компилятор должен просто принять его и принимать его во внимание, не требуя каждого небетонного подтипа, чтобы повторить одно и то же самое.
А я делаю это, чтобы избежать необходимости использовать класс-литой, но я буду буквально расширить каждый класс из этой черты, и я не вижу, что мне нужно повторить эту декларации сотни или даже тысячи раз!