Поскольку цепочка наследования Set <: GenSet <: GenSetLike
немного длинная, может быть не сразу очевидно, где искать код equals
, поэтому я подумал, может быть, я процитирую его здесь:
GenSetLike.scala :
/** Compares this set with another object for equality.
*
* '''Note:''' This operation contains an unchecked cast: if `that`
* is a set, it will assume with an unchecked cast
* that it has the same element type as this set.
* Any subsequent ClassCastException is treated as a `false` result.
* @param that the other object
* @return `true` if `that` is a set which contains the same elements
* as this set.
*/
override def equals(that: Any): Boolean = that match {
case that: GenSet[_] =>
(this eq that) ||
(that canEqual this) &&
(this.size == that.size) &&
(try this subsetOf that.asInstanceOf[GenSet[A]]
catch { case ex: ClassCastException => false })
case _ =>
false
}
По сути, он проверяет, является ли другой объект также GenSet
, и если да, он пытается выполнить некоторые быстрые проверки (например, сравнение size
).и вызывая canEqual
), и если размеры равны, он проверяет, является ли этот набор подмножеством другого набора, предположительно, проверяя каждый элемент.
Итак, точный класс, используемый для представления набора во время выполненияне имеет значения, важно то, что сравниваемый объект также является GenSet
и имеет те же элементы.