为什么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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |