【问题标题】:How to get KClass of generic classes like BaseResponse<Iterable<User>>如何获得像 BaseResponse<Iterable<User>> 这样的泛型类的 KClass
【发布时间】:2019-01-18 21:42:18
【问题描述】:

如果我尝试得到

BaseResponse<Iterable<User>>::class

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    你不能 -KClass 只能描述类 BaseResponse,你可以得到一个 KClass 实例,用 BaseResponse::class 来做这件事。

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

    // 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)))
    

    我选择让类型参数保持不变,KTypeProjection 中还有工厂方法可以根据需要创建协变或逆变类型。

    【讨论】:

    • 然后您可以使用 responseType.javaClass 从 KType 获取实际的 Class
    • @JuanCarry 这是不正确的。它会给你Class&lt;KType&gt;。为了实现这一点,你可以做responseType.classifier as? KClass&lt;BaseResponse&lt;Iterable&lt;User&gt;&gt;&gt; (并处理未经检查的演员表)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2020-09-10
    • 1970-01-01
    • 2019-08-25
    • 2021-06-16
    相关资源
    最近更新 更多