scala - 混合泛型类型

标签 scala types covariance

我想在我的 中混合通用类型myTest

case class CC(i:Int, s:String, s2:String)

case class Value[V](value: V)

def myTest[F](values: (CC ⇒ Value[F])*) = Unit

class QF[M](x: M) {
  def eqs(v: M) = Value(x)
}

implicit def conversion[V](v: V): QF[V] = new QF(v)

myTest(_.i eqs 1)
myTest(_.s eqs "lol")
myTest(_.s eqs "lol", _.s2 eqs "lol2")

直到那时它都有效,但我认为当我尝试混合类型时会出现协方差错误。

当我做 :
myTest(_.i eqs 1, _.s eqs "lol")

我收到以下错误:
Error:(16, 13) type mismatch;
 found   : A$A135.this.CC => A$A135.this.Value[Int]
 required: A$A135.this.CC => A$A135.this.Value[Any]
myTest(_.i eqs 1, _.s eqs "lol");}
           ^

最佳答案

对,那是正确的。因为 ValueV 中定义为不变量, 表示 Value[Int]Value[String]不是 Value[Any] 的子类型,但是 AnyInt最接近的普通父类(super class)型和 String ,即 FmyTest .因为 V处于协变位置,您可以简单地修改它:

case class Value[+V](value: V)

关于scala - 混合泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31960704/

相关文章:

java - 协变结构因 Java 中的捕获错误而失败

scala - 不可变的案例类仍然能够更改参数值

c - 具有相同名称和相同成员类型但成员名称不同的结构

java - 在不同版本的Play Framework下开发和运行

scala - 如何表达更高级类型的类型约束

haskell - RankNType 内的约束

Scala 协方差和下限我不明白

go - 为什么我不能在 Go 中用一种类型的 slice 替换另一种类型?

scala - 你如何在 Play 2.0.x 中获得请求的大小?

scala - 有没有办法阻止 Scala 2.12 破坏 Jackson 对象映射器?