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