Мої знання трохи розмиті щодо класів справи Scala.
Я знаю, що класи case автоматично отримують такі функції, як appply
і unapply
а також перевірка рівності (я припускаю, що це equals
метод)
Автоматична перевірка рівності, яка постачається з класом справи, не завжди є правильною для програми.
Моє запитання таке: якщо у мене є клас case, який розширює абстрактний клас, а абстрактний клас має свій equals(that:Any)
перевизначений, чи буде case case успадковувати перевірку рівності, чи все одно це буде автоматична перевірка рівності?
Відповіді:
1 для відповіді № 1Ви могли читати цей короткий розділ і вам навіть не знадобиться стільки часу, скільки потрібно написати кілька рядків коду, щоб спробувати.
Там сказано, що клас справи отримує копію, а також дорівнює, hashCode і toString, якщо один не успадкований або визначений. Останні повинні бути конкретними та визначеними деінде, ніж у AnyRef.
Це означає, що змішування в ознаці, яка оголошує рівне, не виключає рівне.
Тепер мені потрібно написати рядок коду, щоб підтвердити це ...
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
^