Следующий код не компилируется (в Scala 2.11):Как псевдоним ковариантный универсальный параметр типа
case class CovariantClass[+R](value: R) {
type T = R
def get: R = value
}
object Main {
def main(args: Array[String]): Unit ={
println(CovariantClass[String]("hello").get)
}
}
Сообщение об ошибке:
Error:(4, 8) covariant type R occurs in invariant position in type R of type T
type T = R
^
Почему я не могу псевдоним параметр ковариантного типа? Если я удалю строку type T = R
, код компилирует и печатает hello
, поэтому проблема с псевдонимом. К сожалению, это означает, что я не могу создать псевдоним для более сложных типов, например, type T = List[R]
тоже не скомпилирован, хотя List
является ковариантным.
Благодарим вас за ответ и за цитирование спецификации scala. Я согласен с переименованием 'R' вместо его наложения, но я думал, что имеет псевдоним для чего-то вроде« Либо [ReturnValueInCaseOfFailure, R] ». К сожалению, работа, которую вы предлагаете, делает параметризацию «T», но, вероятно, она ближе всего к тому, что я хотел. –