Вы можете получить класс только по переменным.То же самое происходит в Java, но с немного другим сообщением:
public <T> void x(){
T t = T.class.newInstance();
}
В Java вы можете решить это следующим образом:
public <T> void x(Class<T> cls){
T t = cls.newInstance();
}
То же самое относится к Kotlin, и любойзвонки.Вам нужно будет получить экземпляр класса в большинстве случаев.Тем не менее, Kotlin поддерживает обобщенные обобщенные типы, используя ключевое слово, но только для встроенных обобщенных функций.Вы можете передать класс, но в функциях это действительно просто, просто используя ключевое слово reified.
Так как вы не можете объявить класс с обобщенными обобщенными типами, то есть это недопустимо:
class SomeClass<reified T>
Но это действительно для встроенных функций, то есть вы можете сделать:
inline fun <reified T> someFunction()
Таким образом, у вас есть два варианта.Но так как вы расширяете слушателя, первый вариант добавления обобщений в функцию не вариант.Вы не можете переопределить неуниверсальный метод с помощью дженериков.Это не скомпилируется.
Что оставляет второй вариант, который, к сожалению, довольно хакерский;передача класса конструктору.Итак, это должно выглядеть так:
class FirebaseDBRepo<T : Any>(val child: String, private val cls: Class<T>) {
Теперь я не использую Firebase, поэтому я понятия не имею, какие классы вы будете проходить, поэтому для следующего примера я просто использую String
.
Kotlin поддерживает минимизацию некоторых типов, не переходя к необработанным типам.Это:
val t = FirebaseDBRepo<String>("", String::class.java)
Можно сократить до этого:
val t = FirebaseDBRepo("", String::class.java)
Предполагаемый тип в обоих случаях: FirebaseDBRepo<String>
.