我尝试基于用户定义的数据类模型创建动态服务,它们注册了DataModels()方法应用程序数据模块()它应该在路由器服务中自动创建所有基于的方法。当我试图在这些方法中使用泛型时,我得到了一个编译器错误。是否有其他更好的方法来动态创建路由方法,例如由开发人员定义数据模型,然后自动创建服务创建的?
org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: */api/AppConfigService.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:47)
File is unknown
The root cause java.lang.AssertionError was thrown at: org.jetbrains.kotlin.codegen.coroutines.CoroutineTransformerMethodVisitor.spillVariables(CoroutineTransformerMethodVisitor.kt:636)
fun Application.registerDataModels() {
appDataModule<M1>()
appDataModule<M2>()
appDataModule<M3>()
}
inline fun <reified T: DBModel> Application.appDataModule() {
routing {
createAppData<T>()
updateAppData<T>()
deleteAppData<T>()
}
}
inline fun <reified T: DBModel> Route.createAppData() {
put("/api/data/${getName<T>()}/create") {
authenticated {
create<T>{}
}
}
}
inline fun <reified T: DBModel> Route.updateAppData() {
put("/api/data/${getName<T>()}/update") {
authenticated {
update<T>{}
}
}
}
inline fun <reified T: DBModel> Route.deleteAppData() {
put("/api/data/${getName<T>()}/delete") {
authenticated {
delete<T>{}
}
}
}
1条答案
按热度按时间pepwfjgg1#
您正在将
inline
函数与reified
配合使用。长话短说,
inline
函数被编译并“复制”到它们被使用的位置,已经有了一个固定的类(这就是物化所做的)。你可以这样称呼它:
那么在编译调用代码行时,T的类型已知为String,目标代码行被相应地编译,因此在运行时你知道你的函数中的类型T是什么。(对于这一调用代码行)就好像这个函数是这样开始的:
然而,因为你想动态编译这些类,这个过程失败了,因为这个类显然还不存在。这仅仅是由于
reified
的性质。如果你能以某种方式删除它,它可能会工作。我同意编译器的错误信息在这里更能说明问题。也许你可以在kotlin的问题跟踪平台上提出一个任务?:https://youtrack.jetbrains.com/issues/kt?_gl=15r6x4d_gaMTQyMDYxMjc2MS4xNjMzMzQwMzk5_ga_9J976DJZ68*MTY2OTM1NjM1MS4yMS4xLjE2NjkzNTYzNTcuMC4wLjA.&_ga=2.265829455.1332696793.1669356352-1420612761.1633340399