加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 协变型T出现在不变位置

发布时间:2020-12-16 19:20:52 所属栏目:安全 来源:网络整理
导读:我正在移动我在 Scala的第一步,我想使以下代码工作: trait Gene[+T] { val gene: Array[T]} 编译器给出的错误是:协变类型T出现在type =中的不变位置.值基因的数组[T] 我知道我可以这样做: trait Gene[+T] { def gene[U : T]: Array[U]} 但这并没有解决问
我正在移动我在 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]]的东西,然后用它作为单个基因类的包装器,所以我可以有一个异构数组类型)
是否可以在Scala中执行此操作,或者我只是采取了错误的方法?使用不同的结构会更好吗,比如Scala本地协变类?

提前致谢!

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](这也很难改变内容).如果您希望允许客户端改变基因的内容,则可能无法使基因协变.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读