首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为`trait`定义` `copy` `

为`trait`定义` `copy` `
EN

Stack Overflow用户
提问于 2016-08-23 22:16:39
回答 4查看 1.7K关注 0票数 2

给定:

代码语言:javascript
复制
sealed trait X { val x: String }
case class A(x: String) extends X
case class B(x: String) extends X

我在X特征中定义了一个copy方法:

代码语言:javascript
复制
def copy(x: X, newValue: String): X = x match {
  case A(_) => A(newValue)
  case B(_) => B(newValue)
}

然而,我认为我可以做得更好,也就是说,准确地说。

因为,从技术上讲,仅仅因为A是输入,就可以输出B,因为BX的子类。

所以我试着:

代码语言:javascript
复制
def copyBetter[T <: X](x: T, newValue: String): T = x match {
 case A(_) => A(newValue)
 case B(_) => B(newValue)
}

但是,我得到了编译时错误:

代码语言:javascript
复制
<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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-24 03:19:42

实现具有此签名的方法(忽略null)的唯一方法是def copyBetter[T <: X](x: T, newValue: String): T = x!为什么?因为存在单例类型。鉴于此签名,由于x.typeX的子类型,因此必须编译以下代码

代码语言:javascript
复制
val x = A(1)
val y: x.type = copyBetter[x.type](x, 2)

y的类型说明y必须与x (或null)是同一个对象,因为在你的实现中不是,所以这个实现不适合签名。

票数 2
EN

Stack Overflow用户

发布于 2016-08-23 22:21:39

我的建议如下:

代码语言:javascript
复制
def copyBetter[T <: X](x: T, newValue: String): X = x match {
  case A(_) => A(newValue)
  case B(_) => B(newValue)
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-23 22:22:58

您返回的不是T,而是XAB扩展了X而不是T

尝试使用此签名:

代码语言:javascript
复制
def copyBetter[T <: X](x: T, newValue: String): X = // ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39103720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档