(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 самостоятельно, код, который вы видите здесь, — это все, что существует.
заранее спасибо
class Highway[T <: AbstractRoad[T]#Builder[T]] extends AbstractRoad[T]
Кажется, вы хотите расширить AbstractRoad, а не Builder. - person Samar   schedule 11.09.2016Error:(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