kovariante Typ T tritt in invariante position

Ziehe ich meine ersten Schritte in Scala und ich möchte der folgende code funktioniert:

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

Den Fehler, dass der compiler gibt ist: covariant type T occurs in invariant position in type => Array[T] of value gene

Ich weiß, dass ich tun könnte etwas wie:

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

aber das löst nicht das problem, denn ich brauche einen Wert: praxisgerechtes, was ich versuche zu sagen, ist "I don' T care von der in Art, ich weiß, dass Gene ein gen Feld, das wieder seinen Inhalt". (das " +T hier, da will ich etwas wie type Genome = Array[Gene[Any]] und dann verwenden Sie es als ein wrapper-gegen den gen-Klassen, so kann ich eine heterogene array-Typ)
Ist es möglich, es zu tun in Scala oder bin ich einfach einen falschen Ansatz? Wäre es besser, eine andere Struktur, wie eine Scala native kovariante Klasse?

Vielen Dank im Voraus!

P. S.: ich habe auch versucht mit Klasse und abstrakte Klasse, statt als Eigenschaft, sondern immer die gleichen Ergebnisse!

EDIT: mit freundlichen Vorschlag von Didier Dupont kam ich zu diesem code:

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) 
    }
}

So, ich denke jetzt kann ich setzen und abrufen von Daten in verschiedenen Arten und mit allen Typ-überprüfung goodies!

Schreibe einen Kommentar