Objeto literal de Kotlin que implementa una interfaz genérica de autorreference cardada

Tengo una interfaz (en Java) que toma un argumento genérico de autorreference, y me gustaría crear un object literal en Kotlin que lo implemente. En Java, hago esto al no include los types generics (inseguros), pero no puedo entender cómo hacerlo en Kotlin.

Aquí hay un ejemplo solo de Kotlin, aunque en mi caso la interfaz está en Java.

interface Generic<V, T : Generic<V, T>> { fun stuff(x: V) } class Test { // In Java I would write new Generic() { ... } val v = object : Generic<*, *> { override fun stuff(x: Object) { doSomethingThatDoesntCareAboutTypes() } } } 

Lo que me gustaría poder hacer es algo como esto, pero no funciona:

 val v = object<T : Generic<*, T>> : T { override fun stuff(x: Object) { doSomethingThatDoesntCareAboutTypes() } } 

¿Cómo puedo hacer algo similar a esto sin tener que cambiar la interfaz, que está en un module diferente y no se puede cambiar fácilmente?

Las proyecciones de estrellas son particularmente útiles cuando se consumen interfaces genéricas y rara vez cuando se definen las implementaciones. (¿Similar a Java ? ).

Para poder definir un object que implementa Generic , debe proporcionar arguments de tipo que satisfagan las restricciones. Nothing en particular es el subtipo de todos los types de Kotlin para que pueda escribir:

 val v = object : Generic<Any, Nothing> { override fun stuff(x: Any) { doSomethingThatDoesntCareAboutTypes() } } 

https://kotlinlang.org/docs/reference/generics.html

De acuerdo con la documentation, la proyección en estrella en un tipo invariante como V en su ejemplo se resuelve en. Si el parámetro T no se autorreference, podría usar:

 object : Generic<Any, Any> {} 

Como T se auto reference, necesitará definir realmente una class nombrada para que T haga reference.

 class Test { val v2 : Generic<*, *> init { class Impl: Generic<Any, Impl> { override fun stuff(x: Any) { // ... } } v2 = Impl() } } 

Otra posibilidad sería crear una interfaz que resuelva el genérico de autorreference para usted.

 interface SelfRef<V> : Generic<V, SelfRef<V>> class Test2 { val v = object: SelfRef<Any> { override fun stuff(x: Any) { } } } 
  • @StringRes, @DrawableRes, @LayoutRes y demás annotations de android lint check con los parameters de kotlin
  • Getters y Setters en Kotlin
  • ¿Es seguro llamar a kclass.memberProperties en un object desconocido (Cualquiera)?
  • Choque inusual solo en algún dispositivo: llamadas asincrónicas corotines kotlin
  • Kotlin - Cómo encontrar y moldear un elemento por su tipo
  • Habitación, Kotlin solo tiene problemas con JellyBean
  • ¿Por qué Kotlin usa el modificador del operador fuera de la sobrecarga del operador?
  • RxJava- Gire Observable en Iterator, Stream o Sequence
  • Kotlin Capsule Gradle Error
  • kotlin obtiene vista desde el encabezado NavigationView
  • Error de complemento: Kotlin lanzó una IllegalStateException no detectada