Здравствуйте,
В пакете, код которого я не могу менять, есть такая иерархия классов:
class Outer:
class Inner(number: Int):
???
Я хочу добавить удобную обёртку вокруг Inner, но из-за зависимости Inner от внешнего экземпляра пока удалось разместить её только в подклассе внешнего класса:
new Outer:
case class InnerCase(number: Int) extends Inner(number):
???
(new InnerCase(3)).copy() // sample usage
К сожалению, если наследовать Outer в нескольких местах, этот вспомогательный case class приходится повторять внутри каждого нового подкласса. Чтобы не дублировать определение снова и снова, хотелось бы иметь класс, пригодный для произвольного Outer#Inner. Вот что я попробовал:
case class InnerCase(number: Int)(owner: Outer) extends owner.Inner(number):
???
new Outer:
host =>
InnerCase(3)(host).copy()(host)
new Outer:
host =>
val instance = InnerCase(4)(host).copy()(host)
val widened: Inner = instance // line causing trouble
Но при полиморфном использовании InnerCase там, где требуется Inner, получаю такую диагностику:
Found: InnerCase
Required: Inner
Я всё ещё совсем новичок в Scala, так что наверняка есть более удачный способ сделать задуманное. Вероятно, существует теоретическое объяснение того, почему мой прямой подход нарушает систему типов. В любом случае буду очень рад подсказкам о «правильном» наследовании внутреннего класса.