Kotlin 内联值 class - 无法覆盖 hashCode() 函数

Kotlin inline value class - cannot override hashCode() function

我无法覆盖值 class 上的 hashCode() 函数。 最小的例子(我知道在这个例子中没有必要覆盖它......)

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

我收到错误消息:名为 'hashCode' 的成员已为未来版本保留

编辑:有什么方法可以指定自己的 hashCode() 函数吗?

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

Value classes must adhere to the following limitations:

  • [...]
  • They must not override equals and hashCode member functions of kotlin.Any
  • [...]

这是因为 Kotlin 的开发人员正计划添加一个强类型的 equals 方法,您可以覆盖它。

来自inline classes proposal:

Methods from Any (toString, hashCode, equals) can be useful for a user-defined inline classes and therefore should be customizable. Methods toString and hashCode can be overridden as usual methods from Any. For method equals we're going to introduce new operator that represents "typed" equals to avoid boxing for inline classes:

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

    operator fun equals(other: Identifier): Boolean = ...
}

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

但他们尚未实现此功能。这就是为什么他们不让你实施 hashCode - 因为如果你这样做,你很可能还需要实施 equals(Any?) (很少 useful/correct 只实施 hashCode),但这意味着您的代码将在未来的 Kotlin 版本中崩溃!在未来的版本中,您将需要实现 equals(Identifier),而不是 equals(Any?)

所以你只能等到这个功能被添加了。在那之前,您不能拥有不委托给包装值的 hashCodeequals