scala – 协变型T出现在不变位置
我正在移动我在
Scala的第一步,我想使以下代码工作:
trait Gene[+T] { val gene: Array[T] } 编译器给出的错误是:协变类型T出现在type =>中的不变位置.值基因的数组[T] 我知道我可以这样做: trait Gene[+T] { def gene[U >: T]: Array[U] } 但这并没有解决问题,因为我需要一个价值:实际上我想说的是“我不关心内部类型,我知道基因会有一个返回其内容的基因字段”. (这里的T是因为我想做类似Genome = Array [Gene [Any]]的东西,然后用它作为单个基因类的包装器,所以我可以有一个异构数组类型) 提前致谢! 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) } } 所以我现在认为我可以放置和检索不同类型的数据,并将它们与所有类型检查好东西一起使用! 解决方法
数组是不变的,因为你可以写入它.
假设你这样做 val typed = new Gene[String] val untyped : Gene[Any] = typed // covariance would allow that untyped.gene(0) = new Date(...) 这会崩溃(你的实例中的数组是一个数组[String]并且不接受Date).这就是编译器阻止这种情况的原因. 从那里,它很大程度上取决于你打算用什么做基因.您可以使用协变类型而不是数组(您可以考虑使用Vector),但这会阻止用户改变内容,如果这是您想要的.你可能在类中也有一个Array,前提是它声明为private [this](这也很难改变内容).如果您希望允许客户端改变基因的内容,则可能无法使基因协变. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |