РЕДАКТИРОВАТЬ: Основываясь на пояснениях к вопросу, вы можете создать собственную реализацию Map и переопределить elemEquals ().
Исходная реализация (в HashMap)
protected def elemEquals(key1: A, key2: A): Boolean = (key1 == key2)
Изменить этоto:
protected def elemEquals(key1: A, key2: A): Boolean = (key1 eq key2)
class MyHashMap[A <: AnyRef, B] extends scala.collection.mutable.HashMap[A, B] {
protected override def elemEquals(key1: A, key2: A): Boolean = (key1 eq key2)
}
Обратите внимание, что для использования eq необходимо ограничить ключ в качестве AnyRef или выполнить сопоставление в методе elemEquals ().
case class Foo(i: Int)
val f1 = new Foo(1)
val f2 = new Foo(1)
val map = new MyHashMap[Foo, String]()
map += (f1 -> "f1")
map += (f2 -> "f2")
map.get(f1) // Some(f1)
map.get(f2) // Some(f2)
-Оригинальный ответ
Карта работает с hashCode () и equals ().Правильно ли вы реализовали equals () в своих объектах?Обратите внимание, что в Scala ==
переводится на вызов equals()
.Чтобы получить такое же поведение ==
в Java, используйте оператор Scala eq
case class Foo(i: Int)
val f1 = new Foo(1)
val f2 = new Foo(1)
f1 == f2 // true
f1.equals(f2) // true
f1 eq f2 // false
val map = new MyHashMap (f1 -> "f1", f2 -> "f2")
map.get(f1) // Some("f2")
map.get(f2) // Some("f2")
Здесь класс case реализует equals () для эквивалентности объекта, в данном случае:
f1.i == f1.i
Вам необходимо переопределить equals () в ваших объектах, чтобы включить равенство объектов, например что-то вроде:
override def equals(o: Any) = { o.asInstanceOf[AnyRef] eq this }
Это все равно должно работать с тем же hashCode ().