JVM забывает тип универсального T
в BaseDao<T: Any>()
во время выполнения, поэтому вывод типа завершается неудачно. Решением этой проблемы может быть передача класса KC в T в конструкторе BaseDao:
open class BaseDao<T: Any>(val kClass: KClass<T>) {
...
}
После этого передайте своей функции reified аргумент, который принимает `KClass:
private inline fun <reified T: Any> getCollection(val kClass: KClass<T>): MongoCollection<T> {
return MongoDb.getDatabase().getCollection<T>()
}
Я не знаю, как сделать это, не передавая KClass
в качестве аргумента функции, но это должно сработать, так как универсальный T
может быть получен из предоставленного kClass.
`
Другим способом было бы сделать все методы встроенной функции BaseDao с улучшенными обобщениями и сбросить обобщение в классе.
open class BaseDao() {
inline fun <reified T: Any> get(id: String): T? {
return getCollection().findOneById(id)
}
inline fun <reified T: Any> save (entity: T): T {
return getCollection().save(entity)
}
inline fun <reified T: Any> delete(id: String) {
getCollection().deleteOneById(id)
}
...
}
Таким образом, обобщенный T
может быть получен, так как метод, вызывающий getCollection
, также является усовершенствованным.