有没有办法确保一个类重写hashCode

时间:2018-03-15 20:55:17

标签: scala

我正在创建一个缓存,并希望确保密钥类型覆盖hashCode。 如果还没有在Object上定义hashCode,那么这样就可以了

trait Key {
  def hashCode: Int
}

如果键总是case类,那显然不是问题,但是我想确保如果有人通过普通类它会失败。有没有办法在Scala中做到这一点?

旁注:我的密钥是SQL查询的规范,当前表示为案例类。例如

case class Filter(age: Option[Int], gender: Option[String])

但最终,我希望使用更清晰的规范模式实现来表示它(例如:https://gist.github.com/lbialy/912fad3c909374b81ce7

1 个答案:

答案 0 :(得分:3)

如果要明确将允许使用其hashCode的类列入白名单,则不能使用继承,但您可以提供自己的类型类:

trait HasApprovedHashCode[X] {
  def hashCode(x: X): Int
}

然后修改所有关键依赖正确实现hashCode的方法,如下所示:

def methodRelyingOnHashCode[K: HasApprovedHashCode, V](...) = ...

现在,您只能将那些您认为具有足够好的hashCode实现的类明确列入白名单。

通常,我会说:使用密钥的哈希码不是您的责任。如果您的图书馆用户坚持在脚中拍摄h(im / er)自我,则无法阻止它。你不应该为它提供便利,甚至创造一种几乎不可避免的情况,但是你没有责任去寻找那些在用作地图键时可能会出现某种行为不端的班级。