Следующая псевдоскала выдает ошибку «недопустимая циклическая ссылка»:
trait GenT[A]
trait T extends GenT[T#A] {
type A
}
Вопросы : Почему это незаконно?Есть ли фундаментальная проблема со здоровьем или это ограничение системы типов Scala?Есть ли обходной путь?
Мое намерение состоит в том, чтобы создать черту T
с элементом типа A
, который может быть повышен по требованию до параметра типа через супер-черту GenT[A]
.Одним из приложений может быть выражение ограничений, например
def foo[A, S1 <: GenT[A], S2 <: GenT[A]] ...
Это можно использовать, как если бы это было def foo[S1 <: T, S2 <:T] ...
с ограничением, что S1#A == S2#A
.
Если бы техника была возможна, это также может помочь в вопросе: Как специализироваться на проекции типов в Scala?
Примечание: я мог бы везде использовать GenT
вместо T
, но япытаясь избежать этого, потому что это может привести к тому, что многие параметры типа будут «заразно» распространяться по всему моему коду.
Два приведенных ниже вопроса кажутся похожими, но касаются циклических ссылок другого типа: