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

Scala案例类层次结构

发布时间:2020-12-16 18:40:12 所属栏目:安全 来源:网络整理
导读:我在设计案例课时遇到了一些困难.简化版看起来像: abstract class Base(s: Option[String]) { //code}case class CaseClass(s: Option[String] = None) extends Base(s) { //code} 我有一个方法,我想做的事情如下: def method(base : Base) = { //code bas
我在设计案例课时遇到了一些困难.简化版看起来像:

abstract class Base(s: Option[String]) {
   //code
}

case class CaseClass(s: Option[String] = None) extends Base(s) {
    //code
}

我有一个方法,我想做的事情如下:

def method(base : Base) = {
     //code
     base copy (s = Some("string"))
  }

我当然得到:

value copy is not a member of Base

所以我想要做的是基于我的基类(不是案例类)创建一个新实例.显然,人们不能这样做.但是你如何以优雅的方式解决这个问题呢?

提前致谢!

解决方法

您尝试实现的行为无法实现. case类的copy方法由编译器自动生成,一旦你将一个名为copy的方法添加到你的实现中,编译器就不会生成任何糖.

您可以使用traits重新实现副本,但它不会像生成的那样灵活(每次case类的字段集更改时,您将不得不更新基本特征,复制和方法实现):

sealed trait Base[T] {
   val s: Option[String]
   def copy(s: Option[String]) : T
}

case class CaseClass(override val s: Option[String] = None) extends Base[CaseClass] {
    override def copy(s: Option[String]) = CaseClass(s)
}

def method[T <: Base[T]](base : Base[T]) = base copy (s = Some("strng"))

或者,您可以按如下方式实现方法:

case class CaseClass(s: Option[String] = None)

def method[X <: {def copy(s: Option[String]):X}](base : X) = 
    base copy(s = Some("string"))

scala> method(CaseClass())
res4: CaseClass = CaseClass(Some(string))

因此,如果您的案例类发生变化,您将不需要Base特征,并减少更改次数.

(编辑:李大同)

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

    推荐文章
      热点阅读