ковариантный тип T встречается в инвариантной позиции

Я делаю первые шаги в Scala и хочу, чтобы следующий код работал:

trait Gene[+T] {
    val gene: Array[T]
}

Ошибка, которую выдает компилятор::covariant type T occurs in invariant position in type => Array[T] of value gene

Я знаю, что мог бы сделать что-то вроде:

trait Gene[+T] {
    def gene[U >: T]: Array[U]
}

но это не решает проблему, потому что мне нужно значение :практически, что я пытаюсь сказать: «Меня не волнует внутренний тип, я знаю, что гены будут иметь поле гена, которое возвращает его содержимое». (+T здесь, потому что я хочу сделать что-то вроде type Genome = Array[Gene[Any]], а затем использовать его как оболочку для отдельных классов генов, чтобы я мог иметь гетерогенный тип массива )Можно ли это сделать на Scala или я просто неправильно подхожу? Не лучше ли использовать другую структуру, например собственный ковариантный класс Scala?

Заранее спасибо!

P.S. :Я также пробовал с классом и абстрактным классом вместо типажа, но результат всегда один и тот же!

РЕДАКТИРОВАТЬ :с любезным предложением Дидье Дюпона. Я пришел к этому коду:

package object ga {


  class Gene[+T](val gene: Vector[T]){

    def apply(idx: Int) = gene(idx)

    override def toString() = gene.toString

  }

  implicit def toGene[T](a: Vector[T]) = new Gene(a)

  type Genome = Array[Gene[Any]]

}

package test

import ga._

object Test {
    def main(args: Array[String]) {
        val g = Vector(1, 3, 4)

        val g2 = Vector("a", "b")

        val genome1: Genome = Array(g, g2)

        println("Genome")

        for(gene <- genome1) println(gene.gene) 
    }
}

Итак, теперь я думаю, что могу размещать и извлекать данные в разных типах и использовать их со всеми вкусностями проверки типов!

9
задан Vincenzo Maggio 30 July 2012 в 15:01
поделиться