Kotlin 内联值类 - 不能覆盖 hashCode() 函数



>我只是无法覆盖值类上的hashCode()函数。 最小示例(我知道在此示例中无需覆盖它...

@JvmInline
value class Identifier(val value: String){
override fun hashCode(): Int = this.value.hashCode()
}

我收到错误:名为"hashCode"的成员保留用于将来的版本

编辑:有没有办法指定自己的hashCode()函数?

截至目前,您无法覆盖值类的equalshashCode方法。语言规范明确禁止这样做:

值类必须遵守以下限制:

  • [...]
  • 它们不得覆盖equalshashCodekotlin.Any的成员函数
  • [...]

这是因为 Kotlin 的开发人员计划添加一个可以重写的强类型equals方法。

从内联类提案中:

来自Any(toStringhashCodeequals)的方法对于用户定义的内联类是有用的,因此应该是可定制的。方法toStringhashCode可以像通常的方法一样被覆盖Any。对于方法equals,我们将引入表示"类型化"equals的新运算符,以避免内联类的装箱:

@JvmInline
value class Identifier(val value: String){
override fun hashCode(): Int = ...
operator fun equals(other: Identifier): Boolean = ...
}

这样,当您在具有自定义equals的值类上使用==时,您不必每次都将它们装箱,因为您将它传递给Any.equals方法上的Any?参数。编译器还会从equals(Identifier)实现自动生成equals(Any?)实现。

但他们还没有实现这个功能。这就是为什么他们不让你实现hashCode- 因为如果你这样做,你很可能还需要实现equals(Any?)(只实现hashCode很少有用/正确),但这意味着你的代码会在 Kotlin 的未来版本中中断!在未来的版本中,您需要实现equals(Identifier),而不是equals(Any?)

因此,您只能等到添加此功能。在此之前,您不能拥有不委托给包装值的hashCodeequals

相关内容

  • 没有找到相关文章

最新更新