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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:07:54