У меня есть черта, которая принимает параметр типа, и я хочу сказать, что объекты, реализующие эту черту, также будут соответствовать этому параметру типа (с использованием обобщений для совместимости с Java)
Следующий код:
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 =>
// ...
}
Тогда ошибка исчезает.
Почему я должен повторять одно и то же объявление для каждого неконкретного типа?Если бы у меня был базовый класс, и я сказал бы «extends Comparable», мне не нужно повторять «extends Comparable» в каждом производном типе, пока конкретные классы реализуют метод compareTo.Я думаю, что здесь должно быть то же самое.Я просто говорю, что тип, расширяющий HandleOwner , будет также SELF, и компилятор должен просто принять это и принять это во внимание, не требуя, чтобы каждый не конкретный подтип повторял одно и то же снова.
Я делаю это, чтобы избежать необходимости использовать приведение классов, но я буду буквально расширять каждый класс этой чертой, и я не вижу, что мне придется повторять эти объявления сотнями или даже тысячамираз!