给定:
sealed trait X { val x: String }
case class A(x: String) extends X
case class B(x: String) extends X我在X特征中定义了一个copy方法:
def copy(x: X, newValue: String): X = x match {
case A(_) => A(newValue)
case B(_) => B(newValue)
}然而,我认为我可以做得更好,也就是说,准确地说。
因为,从技术上讲,仅仅因为A是输入,就可以输出B,因为B是X的子类。
所以我试着:
def copyBetter[T <: X](x: T, newValue: String): T = x match {
case A(_) => A(newValue)
case B(_) => B(newValue)
}但是,我得到了编译时错误:
<console>:17: error: type mismatch;
found : A
required: T
case A(_) => A(newValue)
^
<console>:18: error: type mismatch;
found : B
required: T
case B(_) => B(newValue)
^如何使用给定的签名实现copyBetter?
发布于 2016-08-24 03:19:42
实现具有此签名的方法(忽略null)的唯一方法是def copyBetter[T <: X](x: T, newValue: String): T = x!为什么?因为存在单例类型。鉴于此签名,由于x.type是X的子类型,因此必须编译以下代码
val x = A(1)
val y: x.type = copyBetter[x.type](x, 2)y的类型说明y必须与x (或null)是同一个对象,因为在你的实现中不是,所以这个实现不适合签名。
发布于 2016-08-23 22:21:39
我的建议如下:
def copyBetter[T <: X](x: T, newValue: String): X = x match {
case A(_) => A(newValue)
case B(_) => B(newValue)
}发布于 2016-08-23 22:22:58
您返回的不是T,而是X。A和B扩展了X而不是T。
尝试使用此签名:
def copyBetter[T <: X](x: T, newValue: String): X = // ...https://stackoverflow.com/questions/39103720
复制相似问题