Можно ли получить подкласс класса Kotlin из суперкласса?

Я пытаюсь выяснить, возможно ли что-то. Вообще то, что я пытаюсь сделать, это получить тип класса подкласса из объекта-компаньона суперкласса … В нижеприведенном виде обработайте __ как то, что мне нужно

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

Некоторые предпосылки … DataSnapshot – из Firebase, а snapshot.getValue() принимает Class<T> . Если бы я пытался создать экземпляр, скажем, TestModel , код был бы следующим

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

Я не совсем уверен, что то, что я прошу, возможно в Котлине. Я уверен, что это не на Java. Я ненавижу упоминать об этом, но в Свифте это было бы достигнуто с помощью того, что я называю «большой S-я», или « Self , которое является типом класса экземпляра self . Если вы не знаете Swift, self эквивалентен Java и Kotlin.

Любая помощь была бы чрезвычайно оценена!

Из вашего кода это, по-видимому, очень общая функция. Не имеет значения, что такое T и в котором объект-компаньон работает с этой функцией, поэтому у меня есть другая версия:

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

Его можно использовать следующим образом:

 someSnapshot.toModelOfType<SomeFirebaseModel>() 

вместо вашего

 FirebaseModel.fromSnapshot<SomeFirebaseModel>(someSnapshot) 

или с импортом

 fromSnapshot<SomeFirebaseModel>(someSnapshot) 

Я предпочитаю мой, потому что он короче, чем ваша версия без импорта и более свободно, чем ваша версия с импортом.

Я лично предлагаю функции расширения расширения над функциями утилиты Java-стиля .

Несмотря на то, что я сидел на этом несколько дней, не задавая вопроса, я понял это через час после публикации этого вопроса. Это может быть выполнено с помощью типа reified generic , который позволяет использовать общий тип внутри функции, однако их можно использовать только как inline функции. Вот мое решение

 companion object { inline fun <reified T : FirebaseModel> fromSnapshot(snapshot: DataSnapshot): T { val model = snapshot.getValue(T::class.java) model.key = snapshot.key return model } }