You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin:如何在泛型类中调用带具体化类型参数的内联泛型方法

解决无法调用库中reified泛型内联函数的问题

你遇到的问题是:带非reified泛型参数的Test<T>类,无法调用库类Other中的inline fun <reified K> bar()——编译报错提示不能用T作为reified类型参数,原因是类级泛型T会被泛型擦除,编译时无法获取它的具体类型信息,而bar()作为reified内联函数,必须在编译时确定类型。

因为Other是无法修改的库类,可通过以下两种方式解决:

方案一:将泛型参数移到函数级别并声明为reified

如果Test类不需要保留类级泛型,把泛型参数移到foo函数上,同时将函数声明为inline并标记泛型为reified,就能直接传递类型给bar():

class Test {
    inline fun <reified T> foo() {
        val o = Other()
        o.bar<T>() // 编译正常
    }
}

class Other {
    inline fun <reified K> bar() {
        val list = listOf<K>()
    }
}

// 使用示例
val test = Test()
test.foo<String>() // 指定具体类型调用

方案二:保留类级泛型,通过KClass传递类型信息

如果必须保持Test<T>的类级泛型,需要在创建Test实例时传入T的KClass类型令牌,再通过辅助inline函数调用bar():

1. 修改Test类,添加KClass构造参数

import kotlin.reflect.KClass

class Test<T>(private val type: KClass<T>) {
    fun foo() {
        val o = Other()
        o.barWithClass(type)
    }
}

2. 编写辅助扩展函数

为Other类编写inline扩展函数,接收KClass并调用原bar()方法:

inline fun <reified K> Other.barWithClass(clazz: KClass<K>) {
    this.bar<K>()
}

使用示例

val test = Test(String::class)
test.foo()

内容的提问来源于stack exchange,提问作者sujith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:05:38