Я пытаюсь создать типы Tuple, эквивалентные типам в библиотеке Scala, только с помощью метода: +, который расширяет Tuple в Tuple путем добавления N + 1-го значения - чтобы я мог рекурсивно конструировать кортежи:
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
Почему? Можете ли вы предоставить обходной путь, который позволил бы мне рекурсивно создавать кортежи (смешанных, типобезопасных типов значений)?
Спасибо.