¿Cómo implementar esta interfaz Java en Kotlin?

Como Kotlin no tiene primitivos, ¿cómo podría implementarse esto?

public interface A { Object get(Integer i); Object get(int i); } 

No puedo cambiar el código de Java porque es un file de class comstackdo en una biblioteca.

Si una sola implementación, como en la respuesta de @ zsmb13 , no es suficiente para usted y necesita implementaciones separadas para los dos methods en Kotlin, entonces puede agregar una interfaz intermedia que reemplaza el método que acepta Integer con un parámetro que admite nulos:

 private interface IntermediateA : A { override fun get(i: Int?): Any } 

Al implementar esta interfaz en lugar de la A original, el comstackdor de Kotlin distinguirá los dos methods, lo que le permite anularlos de la siguiente manera:

 class C : IntermediateA { override fun get(i: Int) = "primitive" override fun get(i: Int?) = "boxed" } 

 val a: A = C() println(a.get(1)) // primitive println(a.get(1 as Int?)) // boxed 

Si tiene acceso al código Java, puede solucionarlo agregando una anotación de anulación al método que acepta el tipo encuadrado:

 Object get(@Nullable Integer i); 

El comstackdor de Kotlin entiende diferentes types de annotations de anulabilidad, aquí está la list .

Implementando solo un método que toma Int como su parámetro funciona, y puede ser llamado desde Kotlin o Java.

 class B : A { override fun get(i: Int): Any { return "something" } } 

Si descomstacks el bytecode, verás que el comstackdor de Kotlin es lo suficientemente inteligente como para crear ambos methods, y uno de ellos solo networkingirige a la implementación real.

Ejemplo de bytecode descompuesto

Un posible problema es que no puede hacer que el método tome Int? , y se bloqueará con una NullPointerException en la llamada .intValue() si se llama desde Java de esta forma:

 B b = new B(); Integer i = null; b.get(i); 

No estoy seguro de si hay alguna manera de resolver ese caso de uso.

Editar: la respuesta de la tecla de acceso directo contiene el rest de las respuestas.

En Kotlin, podemos declarar:

primitiva int como: Int

boxed int como: Int?

Su interfaz se puede simplificar a:

 private interface ModifiedA : A { override fun get(i: Int?): Any } 

En Kotlin, si implementa esta interfaz modificada, Kotlin le proporcionará dos methods para anular. Uno para el tipo primitivo y otro para el tipo en caja.

 class ImplementationOfA : ModifiedA { override fun get(i: Int) override fun get(i: Int?) } 

escribo una demostración simple en java.

luego conviértalo en kotlin con los complementos de Kotlin en idea o Android Studio .

  • String :: toByteArray () no se comstack en Kotlin
  • Llame al object Kotlin con la delegación de class de Java como método estático
  • ¿Es posible build una aplicación web completa de Node.js usando Kotlin?
  • Kotlin utiliza la interfaz de callback de Java
  • Java -> Conversión de Kotlin con types crudos
  • 'x' no es una function al pasar parameters en Kotlin Javascript
  • ¿Por qué algunos methods de configuration de Java se convierten automáticamente en properties de Kotlin pero otros no?
  • Referencia no resuelta de Kotlin: println de gradle en la CLI
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • Jinq en Kotlin: ¿cómo convertir lambda en Java Serialized Lambda?
  • Anular setter para la variable definida en el constructor pnetworkingeterminado