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

为什么Scala没有类型安全的equals方法?

发布时间:2020-12-16 09:19:09 所属栏目:安全 来源:网络整理
导读:由于发明人突出了 Scala的类型安全性,我不明白对对象(至少从案例类)不存在equals方法,允许仅检查具有相同类型的对象的相等性.我希望一个方法===实现每个默认行为.当然,Java互操作性必须具有一种适用于Any类型的方法,但在许多情况下,我只想检查相同类型的对象
由于发明人突出了 Scala的类型安全性,我不明白对对象(至少从案例类)不存在equals方法,允许仅检查具有相同类型的对象的相等性.我希望一个方法===实现每个默认行为.当然,Java互操作性必须具有一种适用于Any类型的方法,但在许多情况下,我只想检查相同类型的对象之间的相等性.

为什么我需要它?

例如,我有两个案例类,并从中创建对象

case class Pos(x: Int,y: Int)
  case class Cube(pos: Pos)

  val startPos = new Pos(0,0)
  val cubeOnStart = new Cube(startPos)

后来我需要多次检查位置并写入意外

if (startPos == cubeOnStart) {
    // this code will never be executed,but unfortunately this compiles
  }

但是意思

if (startPos == cubeOnStart.pos) {
    // this code can be executed if positions are equal
  }

如果一个方法===可用,我会用直觉来使用它.

有没有一个很好的理由或解释为什么这种方法缺少?

解决方法

Scala中的平等是一团糟,为什么问题(Stack Overflow并不是真正的理想场所)的答案是“因为语言设计师决定Java互操作性在这种情况下胜过了合理的事情”.

至少在Scala的最新版本中,您的startPos == cubeOnStart会导致一个警告,指出比较这些不同类型的值“总是会产生错误”.

Scalaz library通过类型安全的Equal类型类提供您要查找的===运算符.你会写这样的东西:

import scalaz._,Scalaz._

implicit val cubeEqual = Equal.equalA[Cube]
implicit val posEqual = Equal.equalA[Pos]

现在startPos === cubeOnStart将不会编译(这正是我们想要的),但是startPos === cubeOnStart.pos将会返回true.

(编辑:李大同)

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

    推荐文章
      热点阅读