Scala案例类与继承

Scala案例类与继承,scala,inheritance,case-class,Scala,Inheritance,Case Class,我对Scala案例类的了解有点模糊 我知道case类会自动获取函数,比如appply和unapply,还有一个等式检查(我假设它是equals方法) case类附带的自动相等性检查对于应用程序来说并不总是正确的 我的问题是:如果我有一个case类扩展了一个抽象类,并且这个抽象类的等于(that:Any)被重写,case类将继承相等性检查还是仍将是自动相等性检查?您可以阅读,甚至不用编写几行代码就可以尝试 它表示case类得到copy,也等于hashCode和toString,除非继承或定义了其中

我对Scala案例类的了解有点模糊

我知道case类会自动获取函数,比如
appply
unapply
,还有一个等式检查(我假设它是
equals
方法)

case类附带的自动相等性检查对于应用程序来说并不总是正确的

我的问题是:如果我有一个case类扩展了一个抽象类,并且这个抽象类的
等于(that:Any)
被重写,case类将继承相等性检查还是仍将是自动相等性检查?

您可以阅读,甚至不用编写几行代码就可以尝试

它表示case类得到copy,也等于hashCode和toString,除非继承或定义了其中一个。后者必须是具体的,并在AnyRef以外的其他地方定义

这意味着混合声明equals的特性不会禁用equals

现在我必须写一行代码来确认它

scala> trait Ickwals { def equals(other: Any): Boolean }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
[generated]

scala> trait Ickwals { override def equals(other: Any): Boolean = false }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
[as implemented]

scala> trait Ickwals { def equals(other: Any): Boolean ; def copy(i: Int): Nothing }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
<console>:8: error: class C needs to be abstract, since method copy in trait Ickwals of type (i: Int)Nothing is not defined
       case class C(i: Int) extends Ickwals
                  ^
scala>trait Ickwals{def equals(其他:任意):Boolean}
定义特征Ickwals
scala>case类C(i:Int)扩展了Ickwals
定义的C类
scala>:javap C#equals
公共布尔等于(java.lang.Object);
描述符:(Ljava/lang/Object;)Z
[生成]
scala>trait Ickwals{override def equals(其他:任意):Boolean=false}
定义特征Ickwals
scala>case类C(i:Int)扩展了Ickwals
定义的C类
scala>:javap C#equals
公共布尔等于(java.lang.Object);
描述符:(Ljava/lang/Object;)Z
[已实施]
scala>trait-Ickwals{def-equals(其他:任意):布尔;def-copy(i:Int):Nothing}
定义特征Ickwals
scala>case类C(i:Int)扩展了Ickwals
:8:错误:类C需要是抽象的,因为没有定义类型(i:Int)Nothing的trait Ickwals中的方法copy
案例C类(i:Int)扩展了Ickwals
^

你知道你可以自己写几行代码来尝试吗?你甚至不会花那么长时间来写这样一个问题。这是一个公平的观点。但我希望人们能指出潜在的陷阱。例如:
Option.contains
用于等式检查的是什么?“我不知道,还有许多其他函数在内部执行Equality检查。@Andrey在提出有关Equality的问题时,希望进行一些研究。自己做一些实验,如果你不知道什么,试着查一下(谷歌,文档,等等)。当你完成了这个,你可能已经做了足够的研究来发布一个问题。例如,
选项.contains
问题的答案在官方scala文档中很容易回答。