我正在 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 原生协变类?
提前致谢!
PS:我也尝试过使用类和抽象类而不是特征,但结果总是相同!
编辑:在 Didier Dupont 的善意建议下,我来到了这段代码:
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)
}
}
所以我现在认为我可以放入和检索不同类型的数据,并将它们与所有类型检查的好东西一起使用!