SCALA: незаконное наследование; Selfy Typy Y не соответствует Selford Selfype X's Selfype

У меня есть черта, которая принимает тип параметра, и я хочу сказать, что объекты, которые реализуют эту черту, также соответствуют этому параметру этого типа (с использованием универсальных совместимости)

Следующий код:

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, и компилятор должен просто принять его и принимать его во внимание, не требуя каждого небетонного подтипа, чтобы повторить одно и то же самое.

А я делаю это, чтобы избежать необходимости использовать класс-литой, но я буду буквально расширить каждый класс из этой черты, и я не вижу, что мне нужно повторить эту декларации сотни или даже тысячи раз!

14
задан Sebastien Diot 11 September 2011 в 14:34
поделиться