¿Es posible get un tipo de subclass Kotlin dentro de una superclass?

Estoy tratando de averiguar si algo es posible. En general, lo que bash hacer es get un tipo de class de una subclass dentro del object complementario de la superclass … En el fragment de abajo, trate el __ como lo que necesito

 companion object { fun fromSnapshot(snapshot: DataSnapshot): __ { val model = snapshot.getValue(__) model.key = snapshot.key // ... return model } } 

Algunos antecedentes … DataSnapshot es de Firebase, y snapshot.getValue() toma una Class<T> . Si estuviera intentando crear una instancia de, por ejemplo, un TestModel , el código sería el siguiente

 companion object { fun fromSnapshot(snapshot: DataSnapshot): TestModel { val model = snapshot.getValue(TestModel::java.class) model.key = snapshot.key // ... return model } } 

No estoy seguro si lo que estoy preguntando es posible en Kotlin. Estoy bastante seguro de que no está en Java. Odio mencionarlo, pero en Swift, esto se lograría con lo que llamo "yo grande-S", o Self , que es el tipo de class de self de instancia. Si no conoce Swift, self es equivalente a esto de Java y Kotlin.

¡Cualquier ayuda sería muy apreciada!

Desde su código, parece ser una function muy genérica. No importa qué es T y en qué object complementario vive esta function, entonces tengo otra versión:

 inline fun <reified T : FirebaseModel> DataSnapshot.toModelOfType() = getValue(T::class.java).also { it.key = this.key} 

Se puede usar así:

 someSnapshot.toModelOfType<SomeFirebaseModel>() 

en lugar de tu

 FirebaseModel.fromSnapshot<SomeFirebaseModel>(someSnapshot) 

o con importaciones

 fromSnapshot<SomeFirebaseModel>(someSnapshot) 

Prefiero el mío porque es más corto que tu versión sin importar y más fluido que tu versión con importaciones.

Personalmente sugiero preferir las funciones de extensión sobre las funciones de utilidad de estilo Java .

A pesar de que me senté en esto por días sin publicar una pregunta, lo descubrí less de una hora después de publicar esta pregunta. Esto se puede lograr con un tipo genérico reificado , que permite el uso del tipo genérico dentro de una function, sin embargo, estos solo se pueden usar como funciones en inline . Aquí está mi solución

 companion object { inline fun <reified T : FirebaseModel> fromSnapshot(snapshot: DataSnapshot): T { val model = snapshot.getValue(T::class.java) model.key = snapshot.key return model } } 
  • Cómo pasar la interfaz en mi adaptador Kotlin RecylerView y recibir una callback en la actividad de Kotlin
  • Comparando las lists de comparables en Kotlin
  • ¿Cómo obtengo el nombre de class de un nombre de tipo?
  • En Vertx, necesito networkingirigir todas las requestes HTTP a la misma URL, pero para HTTPS
  • Comportamiento extraño de Firebase Dejó de acceder a la networking
  • ¿Por qué sumBy (selector) no devuelve Long?
  • SDK de Firebase en Kotlin - onChildChanged no dispara al primer hijo en la list
  • Consulte el tipo genérico en Kotlin
  • ¿Puedo integrar y usar anuncios admob en un proyecto de Android usando Kotlin?
  • ¿TreeWalker no está trabajando con Kotlin / Gradle?
  • Error de Kotlin Fuel REST Client Proxy