>我只是无法覆盖值类上的hashCode()函数。 最小示例(我知道在此示例中无需覆盖它...
@JvmInline
value class Identifier(val value: String){
override fun hashCode(): Int = this.value.hashCode()
}
我收到错误:名为"hashCode"的成员保留用于将来的版本
编辑:有没有办法指定自己的hashCode()函数?
截至目前,您无法覆盖值类的equals
或hashCode
方法。语言规范明确禁止这样做:
值类必须遵守以下限制:
- [...]
- 它们不得覆盖
equals
和hashCode
kotlin.Any
的成员函数- [...]
这是因为 Kotlin 的开发人员计划添加一个可以重写的强类型equals
方法。
从内联类提案中:
来自
Any
(toString
、hashCode
、equals
)的方法对于用户定义的内联类是有用的,因此应该是可定制的。方法toString
和hashCode
可以像通常的方法一样被覆盖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?)
。
因此,您只能等到添加此功能。在此之前,您不能拥有不委托给包装值的hashCode
和equals
。