Синтаксис параметра типа Scala

(TL;DR Посмотрите на нижний фрагмент кода и ошибки под ним)

Итак, я считаю, что у меня простая проблема, но я новичок в Scala и не вижу ее.

Краткое описание проекта: я создаю класс AbstractRoad, который содержит внутренний класс Builder. Другие классы будут расширять этот класс, например Шоссе, и у них также будут Строители.

AbstractRoad имеет параметр типа A, который может быть любым построителем внутри класса, расширяющего AbstractRoad. Таким образом, все мои методы, которые я пишу в AbstractRoad#Builder, будут применимы к различным строителям подклассов. Эти построители подклассов будут расширять основной построитель AbstractRoad.

У меня проблемы с синтаксисом параметра типа, я получаю ошибку компилятора, которую я перечислил ниже. Вот мои два класса, AbstractRoad:

class AbstractRoad[A <: AbstractRoad[A]#Builder[A]] {
  abstract class Builder[A]{
  }
}

И шоссе:

class AbstractRoad[A <: AbstractRoad[A]#Builder[A]] {
  abstract class Builder[A]{
  }
}

Компиляция этих результатов приводит к двум ошибкам, которые, по сути, говорят мне, что я должен добавить параметры типа к использованию AbstractRoad в Highway.Scala. Не стесняйтесь вставлять их в IDE, чтобы увидеть ошибку компилятора. Справедливо. Я добавил одну ссылку на Highway (также запрошенную компилятором) и две ссылки на AbstractRoad. Это привело к следующему редактированию Highway.Scala: (AbstractRoad не изменился)

class Highway[T] extends AbstractRoad[T]#Builder[Highway[T]#Builder] {
  abstract class Builder extends AbstractRoad[T]#Builder[Builder] {
    }
}

Но теперь я получаю два странных сообщения компилятора, вот они:

Error:(1, 42) AbstractRoad[T] is not a legal prefix for a constructor
class Highway[T] extends AbstractRoad[T]#Builder[Highway[T]#Builder] {
                                         ^
Error:(1, 61) illegal cyclic reference involving class Highway
class Highway[T] extends AbstractRoad[T]#Builder[Highway[T]#Builder] {
                                                            ^
Error:(2, 50) AbstractRoad[T] is not a legal prefix for a constructor
  abstract class Builder extends AbstractRoad[T]#Builder[Builder] {
                                             ^

Я пытаюсь следить за сообщениями компилятора, но не могу решить ни одно из них. Не стесняйтесь вставлять код в IDE самостоятельно, код, который вы видите здесь, — это все, что существует.

заранее спасибо


person sudom82    schedule 11.09.2016    source источник
comment
Разве ваша подпись Highway не должна быть такой: class Highway[T <: AbstractRoad[T]#Builder[T]] extends AbstractRoad[T] Кажется, вы хотите расширить AbstractRoad, а не Builder.   -  person Samar    schedule 11.09.2016
comment
@ Самар, эй, это помогло! Я уменьшился с трех ошибок до одной. И теперь единственная ошибка:: Error:(2, 50) AbstractRoad[T] is not a legal prefix for a constructor abstract class Builder extends AbstractRoad[T]#Builder[Builder] { ^   -  person sudom82    schedule 11.09.2016
comment
Я не думаю, что возможно расширить внутренний класс так, как вы пытаетесь достичь. Есть и другие способы достижения аналогичной функциональности. Проверьте этот вопрос: к внешнему классу   -  person Samar    schedule 11.09.2016