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

scala – 在case类中重命名和覆盖equals方法

发布时间:2020-12-16 19:19:17 所属栏目:安全 来源:网络整理
导读:我想定义一个名为Ext的特性,它将现有的equals方法重命名为equalsByAttributes,并同时定义一个新的equals方法.使用的特征 扩展案例类.我目前的解决方案看起来有点hacky: case class A(id: Int) extends Exttrait Ext { p: Product = // new implementation o
我想定义一个名为Ext的特性,它将现有的equals方法重命名为equalsByAttributes,并同时定义一个新的equals方法.使用的特征
扩展案例类.我目前的解决方案看起来有点hacky:

case class A(id: Int) extends Ext

trait Ext { p: Product =>
    // new implementation
    override def equals(obj: Any) = obj match {
        case that: AnyRef => this eq that
        case _ => false
    }

    // reimplementation of old equals implementation
    def equalsByAttributes(obj: Any) = obj match {
        case that: Product =>
            if (this.getClass.isAssignableFrom(that.getClass) || that.getClass.isAssignableFrom(this.getClass))
                p.productIterator.toList == that.productIterator.toList
            else
                false
        case _ => false
    }
}

我想知道是否有一种直接的方法来引用equalsByAttributes中的A的equals方法,以便可以避免重新实现此方法?

编辑2012-07-12

由于有一个使用super.METHOD_NAME引用超级实现的解决方案,我认为必须有类似的语法,例如overridden.METHOD_NAME,用于访问将由特性扩展的基类/特征中的特定实现,以便我的Ext特质看起来像这样:

trait Ext { p: Product =>
    override def equals(obj: Any) = ...

    def equalsByAttributes(obj: Any) = overridden.equals(obj)
}

解决方法

编译器不会为已经带有等号的case类生成equals(和hashCode),即继承一个或自己声明一个.在 this blog entry中阅读更多相关信息.AFAIK唯一可以做的就是使用 Product trait提供的caseIterator来实现结构相等性,就像在equalsByAttributes中一样.

(编辑:李大同)

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

    推荐文章
      热点阅读