Clase de datos de Kotlin que implementa la interfaz de Java
Estoy tratando de presentar a Kotlin en mi proyecto actual. He decidido comenzar con entidades que parecen correlacionar perfectamente con las classs de datos. Por ejemplo, tengo una class 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:
- El complemento IdeaVim de IntelliJ inhabilita la conversión de Java a Kotlin
- Kotlin Generics tipo personalizado con comodín
- Establecer el setter de una interfaz en la class que lo implementa
- FireStore Transactions incrementa y disminuye el contador obteniendo resultados inconsistentes
- Deshabilitar la compilation incremental para kapt
public interface Entity { Long getId(); }
Pero por alguna razón el comstackdor no comprende que el método ya está implementado:
La class 'Video' se debe declarar como abstracta o implementar la diversión abstracta abstracta del miembro público getId (): kotlin.Long! definido en net.alfad.data.Entity
¿Debo usar palabras key adicionales para id param? Que hace "!" significa en la firma?
- ¿Cuál es la diferencia entre el operador "como" y "es" en Kotlin?
- ¿Puedo usar bibliotecas Java de terceros (.jar) para el desarrollo de Android con Kotlin?
- ¿Qué es "implementación" en las dependencies de Kotlin Gradle?
- Android ViewModelProviderFactory en kotlin
- ¿Cómo adjunto fonts para Kotlin en Android Studio?
- El comstackdor de Kotlin no puede deducir que la variable no puede contener nulos en el ciclo do-while
- La aplicación Kotlin no muestra mi matriz json
- Tipo de Kotlin no coincide al pasar el parámetro
El problema aquí es que Kotlin carga primero la class Java Entity
y ve getId
como una function, no como un getter de alguna propiedad. Un absorbente de properties en una class Kotlin no puede anular una function, por lo que la id
propiedad no está vinculada como una implementación de la function getId
.
Para solucionar esto, debe anular la function original getId
en su class Kotlin. Si lo hace, se producirá un choque de firma de JVM entre su nueva function y el getter de id
en el bytecode, por lo que también debe evitar que el comstackdor genere el getter haciendo que la propiedad sea private
:
data class Video( private val id: Long, ... ) { override fun getId() = id ... }
Tenga en count que esta respuesta se ha adaptado desde aquí: https://stackoverflow.com/a/32971284/288456
Si esta es toda su class de datos, entonces no está anulando getId (). Veo que tiene una propiedad llamada id y Kotlin debería generar un getter para eso, pero eso no se marcará con la palabra key override que necesita indicar que está anulando una function abstracta.
– EDITAR – ¡Alexander me ganó! ¡Su respuesta es mejor de todos modos! 😉
- Cómo convertir la expresión de asignación de Java a Kotlin
- ¿Cómo funciona la syntax de acceso a la propiedad de Kotlin para las classs de Java (es decir, EditText setText)?