如何获得像 BaseResponse<Iterable<User>> 这样的通用类的 KClass

dtu*_*cer 3 kotlin

如果我试图得到

BaseResponse<Iterable<User>>::class
Run Code Online (Sandbox Code Playgroud)

我得到错误错误,类文字的左侧只允许类。我已经搜索过,但仍然没有找到如何在 kotlin 中获取泛型类的类型。

zsm*_*b13 7

你不能 -KClass只能描述类BaseResponse,你可以得到一个KClass实例BaseResponse::class.

但是,您拥有的BaseResponse<Iterable<User>>是一个具体类型,您可以将其表示为一个KType实例。KType例如,可以使用createType函数创建实例。这看起来像这样:

// User
val userType = User::class.createType()
// Iterable<User>
val iterableOfUserType = Iterable::class.createType(arguments = listOf(KTypeProjection.invariant(userType)))    
// BaseResponse<Iterable<User>>
val responseType = BaseResponse::class.createType(arguments = listOf(KTypeProjection.invariant(iterableOfUserType)))
Run Code Online (Sandbox Code Playgroud)

我选择使类型参数既是不变的,也有工厂方法KTypeProjection来创建协变或逆变类型,因为您需要它们。