Является ли следующее ожидаемое поведение или ошибка в Scala?Scala параметризованный общий параметр
СЛУЧАЙ 1:
class X[T1, T2]
class XExt[T1, T2] extends X[T1, T2]
class Y[T[t1] <: X[t1, _]]
class YExt extends Y[XExt]
приводит Ошибка: Xext принимает два параметра типа, как ожидается: один
class YExt extends Y[XExt]
^
Но следующие пробегов OK:
class X[T1, T2]
class XExt[T1, T2] extends X[T1, T2]
class Y[T[t1, t2] <: X[t1, t2]]
class YExt extends Y[XExt]
Сведение к минимуму числа параметров могло бы ify код типа type params: тип T [t1] <: X [t1, _].
СЛУЧАЙ 2:
class X[T1, T2]
class Y[T[t1, t2] <: X[t1, t2]]
class Z[T <: Y[_]]
приводит Ошибки: _ $-не принимают никаких параметров типа, ожидаемые: два
class Z[T <: Y[_]]
^
Но как избежать определения параметров Y, если я не требую их? Как и в:
class X[T1, T2]
class Y[T <: X[_, _]]
class Z[T <: Y[_]]
СЛУЧАЙ 3:
trait A[T]
trait B[T[t] <: A[t]]
trait AExt extends A[Int]
trait BExt extends B[AExt]
приводит Ошибка: Aext не принимает никаких параметров типа, как ожидается: один
trait BExt extends B[AExt]
^
Но почему компилятор запрашивает один параметр, если он уже поставлен? Это противоречие. А как подкласс B?
Такое поведение наблюдается в IntelliJ Scala плагин и Eclipse, Scala IDE. Так что, вероятно, работает компилятор Scala.
Я не думаю, что вы можете, будучи 'Y [_]' вложенный выше вид с ограничением вам необходимо предоставить компиляции достаточно доказательств, что вы уважая это ограничение: класс 'Z [ S [t1, t2] <: X [t1, t2], T <: Y [S]] '. –
@ Ende Neu: Да, но ограничение Y [T] такое же. T все же имеет те же границы. Я не вижу причин указывать T, если я этого не требую. И посмотрите CASE 3. Я только что добавил. –
Нет, 'T' не имеет той же границы,' T' в классе, а второй во втором случае - два разных 'T', только потому, что они имеют одну и ту же букву, не означает, что они связаны. –