我移动我的第一个步骤,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]
}
但因为我需要一个值,这并不能解决问题:pratically什么,我想说的是:“我不关心类型里面的,我知道,基因将有一个基因场返回其内容”。 (在+ T这里是因为我想要做类似type Genome = Array[Gene[Any]]
,然后用它作为针对单个基因类的包装,所以我可以具有异质阵列型)是否有可能做到这一点在斯卡拉或者我只是采取了错误的做法? 它会更好使用不同的结构,像斯卡拉母语协变类?
提前致谢!
PS:我也试过用类和抽象类,而不是特质,但总是相同的结果!
编辑:由迪迪埃杜邦样的建议,我来到这个代码:
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)
}
}
所以我想现在我可以把在不同类型的检索数据,并与所有类型检查的好东西使用它们!