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() 函数吗?
截至目前,您无法覆盖值 类 的 equals
或 hashCode
方法。 language specification 明确禁止这样做:
Value classes must adhere to the following limitations:
- [...]
- They must not override
equals
and hashCode
member functions of kotlin.Any
- [...]
这是因为 Kotlin 的开发人员正计划添加一个强类型的 equals
方法,您可以覆盖它。
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?)
。
所以你只能等到这个功能被添加了。在那之前,您不能拥有不委托给包装值的 hashCode
和 equals
。
我无法覆盖值 class 上的 hashCode() 函数。 最小的例子(我知道在这个例子中没有必要覆盖它......)
@JvmInline
value class Identifier(val value: String){
override fun hashCode(): Int = this.value.hashCode()
}
我收到错误消息:名为 'hashCode' 的成员已为未来版本保留
编辑:有什么方法可以指定自己的 hashCode() 函数吗?
截至目前,您无法覆盖值 类 的 equals
或 hashCode
方法。 language specification 明确禁止这样做:
Value classes must adhere to the following limitations:
- [...]
- They must not override
equals
andhashCode
member functions ofkotlin.Any
- [...]
这是因为 Kotlin 的开发人员正计划添加一个强类型的 equals
方法,您可以覆盖它。
Methods from
Any
(toString
,hashCode
,equals
) can be useful for a user-defined inline classes and therefore should be customizable. MethodstoString
andhashCode
can be overridden as usual methods fromAny
. For methodequals
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?)
。
所以你只能等到这个功能被添加了。在那之前,您不能拥有不委托给包装值的 hashCode
和 equals
。