Из исходного кода scala/Equals.scala
(здесь):
package scala
trait Equals extends scala.Any {
def canEqual(that: scala.Any): scala.Boolean
def equals(that: scala.Any): scala.Boolean
}
В документации говорится:
Метод, который должен вызываться из каждого хорошо спроектированного метода равных значений, который открыт для переопределения в подклассе.
Я случайно выбрал класс, который расширяет scala.Equals
и который достаточно прост для понимания. Я выбрал scala.Tuple2[+T1, +T2]
, который расширяет черту scala.Product[T1, T2]
, которая, в свою очередь, расширяет черту scala.Product
, которая, в свою очередь, расширяет черту scala.Equals
.
К сожалению, кажется, что поскольку scala.Tuple2
является классом case, методы canEqual()
и equals()
автоматически генерируются и поэтому не могут быть найдены в исходном коде scala/Tuple2.scala
(здесь).
Мои вопросы:
- Когда это хорошее время для расширения признака
scala.Equals
? - Как реализовать
canEqual()
? - Каковы наилучшие методы (или шаблоны) для использования
canEqual()
вequals()
?
Спасибо заранее!
PS: Если это имеет значение, я использую Scala 2.11.7.