¿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 } } 
  • Permisosdispatcher y múltiples @ NeedsPermission con kotlin
  • ¿Es correcto el comportamiento de las corutinas?
  • Falló la ejecución de la tarea 'aplicación: copyDebugAndroidTestKotlinClasses' - Android Kotlin Build Error
  • Estoy tratando de reproducir música desde SDcard
  • Advertencia: la opción '-d' con un destino de directory se ignora porque se especifica '-module'
  • ¿Cómo escribo los corchetes de Java "" en Kotlin?
  • Kotlin Unit Test siempre pasa cuando se ejecuta desde la IU de Android Studio
  • Manera idiomática de manejar lists anulables o vacías en Kotlin
  • ¿Cómo funciona el borrado en Kotlin?
  • ¿Por qué aparece una discrepancia de tipo cuando bash devolver un valor para un parámetro genérico verificado?
  • ¿Cuál es la mejor práctica para crear un componente de IU personalizado en tornadofx?