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:

 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?

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! 😉

  • Singleton con parámetro en Kotlin
  • Autocompletado de IntelliJ para files de kotlin de script gradle incluidos
  • Gradle 3.0.0-alpha1 no es compatible con el plugin de kotlin-android 1.1.2-3?
  • Osmdroid y Osmdroid bonuspack cómo usar CacheManager
  • Obtenga ClassLoader de gradle org.gradle.api.Project?
  • La initialization lenta de la propiedad de la class Kotlin no comstackrá
  • Forma idiomática de iniciar session en Kotlin
  • ¿Por qué IntelliJ Idea no encuentra las dependencies de Maven de otro module de Kotlin?
  • ¿Por qué no está vacío en las collections de Kotlin una propiedad?
  • Inicialización de matriz de subprocesss múltiples en Kotlin
  • Array Int bidimensional en Kotlin