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

Scala,Java和平等

发布时间:2020-12-16 08:55:08 所属栏目:安全 来源:网络整理
导读:val filesHere = (new java.io.File(".")).listFilesval filesHere2 = (new java.io.File(".")).listFiles scala filesHere == filesHere2 res0: Boolean = false 这非常直观.我宁愿期望filesHere和filesHere2相等. 这当然是由于Java和Scala之间的语义不匹配
val filesHere = (new java.io.File(".")).listFiles
val filesHere2 = (new java.io.File(".")).listFiles

scala> filesHere == filesHere2
res0: Boolean = false

这非常直观.我宁愿期望filesHere和filesHere2相等.

这当然是由于Java和Scala之间的语义不匹配,例如,关于数组或(文件)相等.显然,我在这里遗漏了一些东西!

解决方法

您可能想通读这里:

http://ofps.oreilly.com/titles/9780596155957/AdvancedObjectOrientedProgramming.html#EqualityOfObjects

但似乎你做了:
filesHere.sameElements(filesHere2)它应该是true.

这里的javadoc在这里:
http://www.scala-lang.org/api/2.6.0/scala/IterableProxy.html#sameElements%28Iterable%5BB%5D%29

更新:

来自第一个链接的几个片段可能会有所帮助:

在Java,C和C#中,==运算符测试以供参考,而不是值相等.相比之下,Ruby的==运算符测试值相等.无论您习惯使用哪种语言,请务必记住在Scala中,==正在测试价值平等.

参考==在列表中未按预期工作:

虽然这看似不一致,但鼓励对两个可变数据结构的相等性进行明确测试是语言设计者的保守方法.从长远来看,它可以帮助您避免条件下的意外结果.

更新2:

根据Raphael的评论,我查看了规范,两天前的最新更新已经过时了,我在http://www.scala-lang.org/files/archive/nightly/pdfs/ScalaReference.pdf看到了这些:

Method equals: (Any)Boolean is structural equality,where two instances
are equal if they both belong to the case class in question and they have equal
(with respect to equals) constructor arguments.

class AnyRef extends Any {
    def equals(that: Any): Boolean = this eq that
    final def eq(that: AnyRef): Boolean = . . . // reference equality

因此,似乎Scala 2.10.2中的定义没有改变,因为规范似乎是一致的.如果行为不同,那么如果您编写单元测试,则应将其作为Scala的错误发送.

(编辑:李大同)

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

    推荐文章
      热点阅读