Crear una instancia de una class concreta de Java que use generics recursivos en Kotlin

¿Puedo crear una instancia de una class concreta de Java que utilice generics recursivos en Kotlin? En caso afirmativo, ¿cómo?

Detalles

Estoy tratando de crear una instancia de una class de Java que usa generics recursivos similar al ejemplo a continuación. Encontré un trabajo para envolver la class Java en una nueva class, pero parece que estoy eludiendo un problema que podría manejar directamente.

Clase de Java con generics recursivos

public class MyLegacyClass<T extends MyLegacyClass<T>> { // implementation ... } 

Cómo se crea una instancia en Java

 // In Java we just ignore the generic type... MyLegacyClass myLegacyClass = new MyLegacyClass(); 

Intentos fallidos de crear una instancia en Kotlin

 class myClass { // Error: One type argument expected for class... val x: MyLegacyClass = MyLegacyClass() // Still 'Error: One type argument expected for class..' You start to see the problem here. val y: MyLegacyClass<MyLegacyClass<MyLegacyClass<MyLegacyClass>>> = MyLegacyClass() } 

Solución de Kotlin

 class MyLegacyClassWrapper : MyLegacyClass<MyLegacyClassWrapper>() class myClass { val x: MyLegacyClass<MyLegacyClassWrapper> = MyLegacyClassWrapper() } 

¿Puedo instanciar una class concreta de Java que usa generics recursivos en Kotlin? si es así, ¿cómo?

No, no puedes . El problema está relacionado con la varianza.

Esta class de Java:

 public class MyLegacyClass<T extends MyLegacyClass<T>> {} 

es igual a esta class de Kotlin:

 class MyLegacyClass<T : MyLegacyClass<T>> 

eso es invariante en su parámetro T En su lugar, necesitaría un tipo de covariante , entonces, en este caso:

 class MyLegacyClass<out T : MyLegacyClass<T>> 

Pero no puede hacerlo sin crear una nueva class Kotlin debido a la interoperabilidad de Java.

MyLegacyClass la class MyLegacyClass a la covariante de Kotlin en su parámetro T si fuera posible, de lo contrario, su enfoque es correcto.

  • Evento táctil de interceptación y networkingirigirlo en function del estado del evento de movimiento
  • Cuál es la diferencia entre la class normal y la class de datos en kotlin
  • Mutar cadena de una extensión
  • Kotlin y los constructores generics me dejan desconcertado
  • Moshi ignora el campo en Kotlin
  • variable de reference de kotlin no resuelta
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • Devuelve el valor de la condición if / else, pero también ejecuta el código
  • ¿Cuál es la razón detrás de "reference no resuelta" cuando se usa kotlin para FacebookLogin?
  • ¿Cómo usar Kotlin async y esperar por factoriales?
  • Concatenación de secuencia Kotlin