Приведенные ниже код генерирует:
хэш-код зовут
хэш-код зовут
Имени равняется
ID = 0множественные inherance, наборы и хэш-код/равен главной
import scala.collection.mutable
object TestTraits {
def main(args: Array[String]): Unit = {
val toto0 = new Person(0,"toto")
val toto1 = new Person(1,"toto")
val peoples = mutable.Set.empty[PersonID]
peoples.add(toto0)
peoples.add(toto1)
peoples.foreach(_.showID)
//peoples.foreach(_.saySomething)//won't compile'
}
}
trait Name{
var theName=""
override def hashCode(): Int = {
println("Name's hashCode")
var hash = 5;
hash = 71 * hash + this.theName.##;
hash
//super.hashCode()//infinite loop
}
override def equals(that: Any): Boolean = {
println("Name's equals")
that match {
case that: Name => this.theName.equals(that.theName)
case _ => false
}
}
}
abstract class PersonID{
val idNumber: Int
override def hashCode(): Int = {
println("PersonID's hashCode")
super.##
}
override def equals(that: Any): Boolean = {
println("PersonID's equals")
that match {
case that: PersonID => this.eq(that)
case _ => false
}
}
def showID: Unit = {
println("ID=" + idNumber)
}
}
class Person(val id:Int, val s:String) extends {
val idNumber=id
} with PersonID with Name {
/*override def hashCode(): Int = {
println("Person's hashCode")
super.## //infinite loop !!
}
override def equals(that: Any): Boolean = {
println("Person's equals")
that match {
case that: Person => this.eq(that)
case _ => false
}
}*/
theName=s
def saySomething: Unit = {
print("Hello, my name is " + theName + ", ")
showID
}
}
Так как "народы" представляет собой набор PersonId , Я ожидал следующий результат:
Персональный код hashCode
Персональный идентификатор hashCode
ID = 0
ID = 1
Может ли кто-нибудь объяснить это поведение и как сделать то, что я ожидал (т. Е. Иметь класс с «равными» на основе значений полей, кроме случаев, когда экземпляр помещается в Set [PersonID])
Другая загадка - почему я получаю бесконечные циклы, когда использую super.hashCode() в своем обычном хэш-коде?
PS: Я использую предварительно инициализированный абстрактный элемент, потому что мне нужно это в моем реальной пользе деле ...
Спасибо за ваш ответ, теперь ясно, что я должен реализовать это по-другому. – acapola