Можно использовать только параметры типа reified со встроенными функциями. Поэтому, если мне нужен такой параметр для класса, мне понадобится такой трюк:
class Foo<T : Any>(private val clazz: KClass<T>) {
companion object {
inline fun <reified T: Any> create() = Foo(T::class)
}
}
Затем я могу создать экземпляры Foo
следующим образом:
val foo = Foo.create<Bar>()
В пределах Foo
у меня есть доступ clazz
, но у меня вопрос , могу ли я тогда использовать clazz
, когда мне нужно вызвать методы, требующие параметра типа reified` ?
например. в Foo
я бы хотел добавить такой метод:
fun print(list: List<Alpha>) {
list.filterIsInstance<T>().forEach { print(it) }
}
Но, насколько я могу судить, нет способа получить от clazz
что-то, что я могу использовать здесь в качестве параметра типа.
И да, я знаю, что есть форма filterIsInstance
, которая принимает Class
, поэтому я могу сделать:
list.filterIsInstance(clazz.java).forEach { print(it) }
Однако во многих библиотеках есть методы, в которых обе формы (явный параметр класса и параметр типа reified) не предоставлены.
например. Джексон Котлин Extensions.kt . На самом деле это не очень хороший пример, так как все эквиваленты без reified являются однострочными, но это не всегда так - тогда вы в конечном итоге распаковываете реализацию метода reified-type-parameter в ваш код.