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!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Array ist unveränderlich, weil Sie schreiben kann es.
Angenommen, Sie wollen
diese Abstürzen würde (das array in deinem Beispiel ein Array[String] und wird nicht akzeptieren, ein Datum). Das ist der Grund, warum der compiler verhindert, dass.
Davon, es hängt sehr viel auf das, was Sie beabsichtigen zu tun mit Gen. Könnte man eine kovariante Art statt
Array
(Sie könnenVector
), aber das wird verhindern, dass Benutzer mutieren Sie die Inhalte, wenn es dies war, was Sie beabsichtigte. Sie können auch ein Array innerhalb der Klasse, vorausgesetzt, es ist decladedprivate [this]
(die machen es ziemlich schwer zu mutieren, der Inhalt auch). Wenn Sie möchten, dass der client sein darf, mutieren Sie die Inhalte eines Gens, wird es wohl nicht möglich, die kovariante Gen.typed
aber habe es nicht verwenden. Es sollte auf der zweiten Linie stattgene
Recht?Den Typ der
gene
werden muss kovariante in seiner Typ-parameter. Damit das möglich wird, müssen Sie wählen Sie eine unveränderliche Datenstruktur, zum Beispiel Liste. Aber Sie können jede Daten-Struktur aus derscala.collection.immutable
Paket.