Скажите, что у меня есть следующие черты:
trait A
trait B { this: A => }
trait C extends B // { this: A => }
Ошибка компилятора: illegal inheritance; self-type C does not conform to B's selftype B with A
Как ожидалось, если я некомментирую сам аннотация типа, компилятор счастлив.
Я думаю, что довольно очевидно, почему C также нужно это сам тип. Что я не понимаю, почему это не может "наследовать" его от, если компилятор мог бы уже выяснить, что это необходимо?
Я думаю, что это могло уменьшить многословие, когда Вы используете сам типы со сложными иерархиями, особенно если Вы смешиваетесь в большом наборе черт, каждом из них имеющий его собственное сам тип.
Я предполагаю, вероятно, существует серьезное основание для текущего поведения, я просто не мог найти/выяснить, каково это.
Сначала я думал, что это могло бы быть связано со смешиванием линеаризации, но это кажется мне, это не играет здесь (даже если у меня было больше черт, смешанных в с более сложным сам типы).
Это вызвало бы неоднозначности в некоторых случаях? Если так, почему это не может работать, когда нет никакой неоднозначности?
Или это связано с некоторыми трудностями при надлежащей реализации его?
Я мог найти некоторые дискуссии о теме (как сам, тип не наследован), но они главным образом просто заявляют проблему и приходят к заключению, что это - то, как это без слишком большого объяснения и/или решения (если это существует).
trait C extends B with A
- не единственное решение. У вас также может быть
trait AA extends A
trait C extends B with AA
, то есть все, что наследует интерфейс A
, принимается. Если вы должны полагаться на конкретную реализацию, вы должны выбрать миксин; если реализация зависит от пользователя или у вас есть веская причина не указывать миксин в трейте (например, чтобы ослабить проблемы с зависимостями), вы должны сделать его самотипом.