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ᴇʀ
相关产品推荐
相关产品推荐

