Ковариация в программировании на уровне типов

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

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

Спасибо.

9
задан jsalvata 9 November 2011 в 14:43
поделиться