Посмотрите на
val meta = metaRepository.getMeta(entity!!::class)!!
Какой тип вы ожидаете для meta
?Вероятно Meta<T>
.Но если вы попытаетесь аннотировать это, вы увидите, что это неправильно.На самом деле предполагается, что он равен Meta<out T>
(в основном потому, что entity
действительно может принадлежать какому-то подклассу T
, поэтому entity!!::class
равно KClass<out T>
).
То есть field
равно Field<Nothing, out Any>
, а field.get
требует Nothing
в качестве аргумента.
Решение - параметры уточненного типа для получения KClass<T>
вместо:
inline fun <reified T : Any> doSomthing(entity: T?) {
val meta = metaRepository.getMeta(T::class)!!
meta.getFields().forEach { field ->
val fieldValue = field.get(entity!!)
// Unit at the end isn't needed
}
}
К сожалению, getMeta
сам по себе не может использовать reified
, потому что это интерфейсный метод и нечего встраивать, но вы можете создать вспомогательный метод, чтобы упростить вызовы к нему:
inline fun <reified T : Any> MetaRepository.getMeta1() = getMeta(T::class)
...
val meta = metaRepository.getMeta1<T>()!!
Примечание: если вам нужно, чтобы entity
не было null
в любом случае (используя entity!!
), вероятно, нет веской причины для того, чтобы сделать его типом T?
вместо T
.