请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答

3回答

bennyhuo 2017-11-04 12:23:19

主要是考虑到 data class 的equals 的问题。如果data class 可以被继承,那么就会出现 x.equals(y) == true,y.equals(x) == false  的情形。


关于这个问题,在 scala 当中也有过很多讨论,亲可以参考下 StackOverflow 中的这个回答~What is *so* wrong with case class inheritance?

0 回复 有任何疑惑可以回复我~
  • 提问者 慕田峪8379950 #1
    未能解惑,如果是继承的子类,自然是要重写equals的,这样子类自然比父类多几个属性,自然是不能相等的啊,如果需要作比较那就需要 显式地强制转换成父类啊。
    又衍生出一个疑问 为什么equals传入的值为Any而不是this?类型都不相同为什么可以比较相等?
    另外希望能帮我解决下我提出的另一个提问。感激不尽
    回复 有任何疑惑可以回复我~ 2017-11-04 12:32:53
提问者 慕田峪8379950 2017-11-04 12:32:07

未能解惑,如果是继承的子类,自然是要重写equals的,这样子类自然比父类多几个属性,自然是不能相等的啊,如果需要作比较那就需要 显式地强制转换成父类啊。
又衍生出一个疑问 为什么equals传入的值为Any而不是this?类型都不相同为什么可以比较相等?

另外希望能帮我解决下我提出的另一个提问。感激不尽。

0 回复 有任何疑惑可以回复我~
  • 在比较前很可能你不知道它是啥类型,你就不让人家比较了吗?
    
    另外,父类引用指向子类实例的事情很常有,导致相等性无法传递和对称的事情会给使用者带来很大的麻烦。
    回复 有任何疑惑可以回复我~ 2017-11-04 13:13:26
  • 提问者 慕田峪8379950 回复 bennyhuo #2
    我的想法是,既然在代码中需要去比较两个值了,那首先应该先把这2个值转为同一类型。如果不知道类型,那么在转换是就会报错。 我在源码中发现equals本来就是在比较同一对象后使用 as 强转,再比较具体的属性。使用this传值也不会在使用时增加很多代码量,仅仅多个as转换类型。不同类型强转在这里报错与在euqals内报错不都差不多吗,在外部实现还可以有更多的方案。
    
    我知道既然设计为Any那必然是有其道理的。只是我不能理解罢了。
    
    望老师指点迷津。
    回复 有任何疑惑可以回复我~ 2017-11-04 13:25:16
  • 提问者 慕田峪8379950 回复 bennyhuo #3
    嗯,能够理解了,是什么形式其实并不重要。
    回复 有任何疑惑可以回复我~ 2017-11-04 15:29:51
提问者 慕田峪8379950 2017-11-04 12:32:06

未能解惑,如果是继承的子类,自然是要重写equals的,这样子类自然比父类多几个属性,自然是不能相等的啊,如果需要作比较那就需要 显式地强制转换成父类啊。
又衍生出一个疑问 为什么equals传入的值为Any而不是this?类型都不相同为什么可以比较相等?

另外希望能帮我解决下我提出的另一个提问。感激不尽。

0 回复 有任何疑惑可以回复我~
  • 你还提了啥问题。。没找着呀。。
    回复 有任何疑惑可以回复我~ 2017-11-05 07:46:00
  • 提问者 慕田峪8379950 回复 bennyhuo #2
    那是重复的,我不会删除评论。。.
    回复 有任何疑惑可以回复我~ 2017-11-05 22:50:26
  • 提问者 慕田峪8379950 回复 bennyhuo #3
    是还有一个问题,
    我想知道java中序列化对象传递的是什么,仅仅是对象的属性吗( 坐标 例子中的两个Double值按照特殊的规定排列,就像json一样)
    回复 有任何疑惑可以回复我~ 2017-11-05 23:00:05
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信