Ktor泛型类调用call.receive报MType无法作为实化类型参数怎么解决
报错原因
call.receive<T>()是Ktor提供的带**实化泛型参数(reified)**的内联扩展方法,要求编译期必须能确定T的具体类型。你代码中的MType是类级别的泛型参数,JVM泛型擦除机制会在编译后抹掉泛型的具体类型信息,无法满足reified参数的要求,因此触发编译报错。
修复方案
共有两种常用修复方式:
方案1:构造函数传入MType的KClass实例(推荐,无额外依赖)
直接调用Ktor提供的接收KClass作为参数的receive重载,构造类的时候传入具体类型的KClass即可:
import kotlin.reflect.KClass import io.ktor.server.request.receive class APIRoute<EType : IntEntity, MType : Any>( // 构造参数接收MType的类型信息 private val mTypeClazz: KClass<MType> ) { fun Route.apiRoute() { post { // 调用接收KClass参数的重载方法 val m = call.receive(mTypeClazz) call.respond(f(model)) } } } // 初始化类时传入具体类型的KClass val userApiRoute = APIRoute<UserEntity, UserDTO>(UserDTO::class)
方案2:传入KType实例(支持带嵌套泛型的MType)
如果你的MType本身也是带泛型的类型(比如List<UserDTO>、Map<String, Int>),可以用KType传递完整类型信息,需要引入kotlin-reflect依赖:
import kotlin.reflect.KType import kotlin.reflect.typeOf import io.ktor.server.request.receive class APIRoute<EType : IntEntity, MType : Any>( private val mType: KType ) { fun Route.apiRoute() { post { val m = call.receive<MType>(mType) call.respond(f(model)) } } } // 初始化时用typeOf获取完整泛型信息 val userListRoute = APIRoute<UserEntity, List<UserDTO>>(typeOf<List<UserDTO>>())
内容的提问来源于stack exchange,提问作者LIshy2
相关产品推荐
相关产品推荐

