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

Kotlin泛型函数调用报错:类型不匹配,出现MyClass.Companion怎么办?

问题:Kotlin泛型函数调用时类型不匹配报错

我编写了如下泛型函数:

fun <T> myFunction(res: Response, type: T): T {
        return res.`as`(type!!::class.java)
}

我希望按如下方式调用该函数:

fun anotherFunction(): MyClass {
        val res = getResponse()
        return myFunction(res, MyClass)
}

但出现如下错误:

类型不匹配。
必需:MyClass
找到:MyClass.Companion

解决方案

方案1:修改泛型函数参数为KClass<T>,传入类引用

把函数的第二个参数改为KClass<T>,直接传入类的Kotlin引用即可获取类型信息:

fun <T> myFunction(res: Response, type: KClass<T>): T {
        return res.`as`(type.java)
}

// 调用方式
fun anotherFunction(): MyClass {
        val res = getResponse()
        return myFunction(res, MyClass::class)
}

方案2:使用reified泛型简化调用(推荐)

如果允许函数为inline类型,利用reified泛型可以省去显式传递类型参数的步骤,代码更简洁:

inline fun <reified T> myFunction(res: Response): T {
        return res.`as`(T::class.java)
}

// 调用方式
fun anotherFunction(): MyClass {
        val res = getResponse()
        return myFunction(res)
        // 也可显式指定泛型:myFunction<MyClass>(res)
}

方案3:传入MyClass实例(不推荐)

如果一定要保留原函数的参数签名,需要传入MyClass的实例而非类本身,但这种方式没必要——因为我们只需要类型信息,不需要实例对象:

// 调用方式(仅作兼容参考)
fun anotherFunction(): MyClass {
        val res = getResponse()
        return myFunction(res, MyClass()) // 要求MyClass有可访问的无参构造函数
}

内容的提问来源于stack exchange,提问作者ᴜsᴇʀ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:35:21