Kotlin泛型函数sqr编译错误排查:为何无法运行?
问题分析与解决方案
嘿,我来帮你排查这个泛型sqr函数的问题~
你的代码之所以无法运行,核心原因在于:Number类本身并没有定义乘法运算符(*)。虽然Int、Double这些具体数字类型都实现了自己的乘法逻辑,但作为它们的父类,Number并没有提供统一的乘法方法,编译器没法知道该如何对一个泛型的T : Number实例执行乘法操作。
修复后的代码方案
我们可以借助reified泛型(配合inline函数)来在运行时判断具体的数字类型,然后针对每种类型执行乘法:
inline fun <reified T : Number> sqr(value: T): T { return when (value) { is Int -> (value * value) as T is Double -> (value * value) as T is Float -> (value * value) as T is Long -> (value * value) as T is Short -> (value * value) as T is Byte -> (value * value) as T else -> throw IllegalArgumentException("不支持的数字类型") } } fun main() { print("${sqr(5)}") // 输出25 }
为什么这样可行?
reified关键字让我们能在函数内部获取到泛型T的实际类型(普通泛型会在编译时被擦除,无法直接判断),而inline是使用reified的必要条件。- 通过
when分支匹配具体的数字类型,调用该类型原生的乘法逻辑,最后将结果强转为T类型返回,完美贴合你想要的“输入什么数字类型,就返回什么类型”的需求。
如果你的场景不需要严格返回原类型,也可以简化为返回Number类型,但上面的方案更符合你原代码的设计意图。
内容的提问来源于stack exchange,提问作者Rustam
相关产品推荐
相关产品推荐

