Simplemente no puedo anular la función hashCode() en la clase de valor. ejemplo mínimo (sé que en este ejemplo no hay necesidad de anularlo...)
@JvmInline value class Identifier(val value: String){ override fun hashCode(): Int = this.value.hashCode() }Recibo un error: el miembro con el nombre 'hashCode' está reservado para versiones futuras
Editar: ¿Hay alguna forma de especificar la función hashCode() propia?
A partir de ahora, no puede anular el método equals o hashCode de las clases de valor. La especificación del idioma explícitamente no permite esto:
Las clases de valor deben cumplir con las siguientes limitaciones:
- [...]
- No deben anular las funciones de miembro
equalsyhashCodedekotlin.Any- [...]
Esto se debe a que los desarrolladores de Kotlin planean agregar un método de equals fuertemente tipado que puede anular.
De la propuesta de clases en línea :
Los métodos de
Any(toString,hashCode,equals) pueden ser útiles para clases en línea definidas por el usuario y, por lo tanto, deben ser personalizables. Los métodostoStringyhashCodese pueden anular como métodos habituales deAny. Para el método deequals, vamos a introducir un nuevo operador que representa laequals"escrita" para evitar el encasillamiento de las clases en línea:
@JvmInline value class Identifier(val value: String){ override fun hashCode(): Int = ... operator fun equals(other: Identifier): Boolean = ... } Esto es para que cuando use == en clases de valor con un equals personalizado, no tenga que encajonarlas cada vez que las pase a Any? parámetro en el método Any.equals . El compilador también generaría automáticamente una implementación de equals(Any?) a partir de su implementación de equals(Identifier) .
Pero aún no han implementado esta función. Esta es la razón por la que no le permiten implementar hashCode , porque si lo hace, lo más probable es que también necesite implementar equals(Any?) (rara vez es útil/correcto implementar hashCode ), pero eso significa que su código se rompería en futuras versiones de Kotlin! En versiones futuras, deberá implementar equals(Identifier) , no equals(Any?) .
Por lo tanto, solo puede esperar hasta que se agregue esta función. Hasta entonces, no puede tener hashCode y equals que no se deleguen en el valor envuelto.