Ковариантность в программировании на уровне типов
Я пытаюсь создать типы Tuple, эквивалентные тем, которые есть в библиотеке Scala, только с помощью метода: +, который расширяет Tuple до Tuple путем добавления значения N + 1st - так что я смогу рекурсивно создавать Tuple :
class Test {
abstract class Tuple {
//protected type Next[_] <: Tuple
//def :+[T](p: T): Next[T]
}
case class Tuple0() extends Tuple {
protected type Next[T] = Tuple1[T]
def :+[T](p: T): Next[T] = Tuple1(p)
}
case class Tuple1[+T1](p1: T1) extends Tuple {
protected type Next[T] = Tuple2[T1, T]
def :+[T](p: T): Next[T] = Tuple2(p1, p)
}
case class Tuple2[+T1, +T2](p1: T1, p2: T2) extends Tuple {
protected type Next[-T] = Nothing
def :+[T](p: T): Next[T] = throw new IndexOutOfBoundsException();
}
}
Это компилируется, но как только я раскомментирую определение Tuple # Next, я получаю:
Test.scala:13: error: covariant type T1 occurs in invariant position in type [T]Test.this.Tuple2[T1,T] of type Next
protected type Next[T] = Tuple2[T1, T]
^
one error found
Почему это? Можете ли вы предоставить обходной путь, который позволил бы мне рекурсивно создавать кортежи (из смешанных типов значений, безопасных для типов)?
Благодарю.