java - method - new in kotlin
Clase de datos Kotlin implementando la interfaz Java (2)
El problema aquí es que Kotlin carga primero la clase Java Entity
y ve getId
como una función, no como un getter de alguna propiedad. Un captador de propiedades en una clase de Kotlin no puede anular una función, por lo que el id
propiedad no está vinculado como una implementación de la función getId
.
Para solucionar esto, debe anular la función original getId
en su clase de Kotlin. Si lo hace, se producirá un conflicto entre las firmas JVM entre su nueva función y el getter de id
en el bytecode, por lo que también debe evitar que el compilador genere el getter haciendo que la propiedad sea private
:
data class Video(
private val id: Long,
...
) {
override fun getId() = id
...
}
Tenga en cuenta que esta respuesta se ha adaptado desde aquí: https://stackoverflow.com/a/32971284/288456
Estoy tratando de introducir a Kotlin en mi proyecto actual. Decidí comenzar con entidades, que parecen estar perfectamente relacionadas con las clases de datos. Por ejemplo tengo una clase de datos:
data class Video(val id: Long, val ownerId: Long, val title: String, val description: String? = null,
val imgLink: String? = null, val created: Date? = null, val accessKey: String? = null,
val views: Long? = null, val comments: Long? = null, val videoLink: String? = null): Entity
Que implementa la interfaz de Java:
public interface Entity {
Long getId();
}
Pero por alguna razón, el compilador no entiende que el método ya está implementado:
La clase ''Video'' debe ser declarada abstracta o implementar miembro abstracta pública, diversión y diversión getId (): kotlin.Long! definido en net.alfad.data.Entity
¿Tengo que usar alguna palabra clave adicional para id param? Que hace "!" ¿Significa en la firma?
Si esta es toda su clase de datos, entonces no está sustituyendo a getId (). Veo que tiene una propiedad llamada id y Kotlin debería generar un captador para eso, pero eso no se marcará con la palabra clave de anulación que debe indicar que está anulando una función abstracta.
- EDITAR - ¡Alejandro me derrotó! ¡Su respuesta es mejor de todos modos! ;)