Ковариантность в программировании на уровне типов

Я пытаюсь создать типы 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

Почему это? Можете ли вы предоставить обходной путь, который позволил бы мне рекурсивно создавать кортежи (из смешанных типов значений, безопасных для типов)?

Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос