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

Kotlin中如何对可取值为Int/Float的两个Any类型变量执行加减乘除运算

错误原因

Kotlin是静态类型语言,Any类型没有默认实现四则运算符的重载,你的visit()方法返回类型为Any?,编译器无法找到匹配的运算符实现,因此抛出编译错误。

解决方案

你可以先把Any?类型的返回值显式转换为数值类型再做运算,提供两种常用实现方案:

方案1:统一转Float运算(简单通用)

如果不需要严格区分返回值类型是Int还是Float,直接统一转换为Float运算即可:
首先定义辅助转换函数:

private fun Any?.toNumericFloat(): Float {
    return when(this) {
        is Int -> this.toFloat()
        is Float -> this
        else -> throw IllegalArgumentException("仅支持Int和Float类型运算")
    }
}

修改原运算代码:

when (node.op.type) {
  TokenType.PLUS -> return visit(node.left).toNumericFloat() + visit(node.right).toNumericFloat()
  TokenType.MINUS -> return visit(node.left).toNumericFloat() - visit(node.right).toNumericFloat()
  TokenType.MUL -> return visit(node.left).toNumericFloat() * visit(node.right).toNumericFloat()
  TokenType.DIV -> return visit(node.left).toNumericFloat() / visit(node.right).toNumericFloat()
}

方案2:保留Int类型返回(符合类型感知需求)

如果要求两个操作数均为Int时返回Int结果,否则返回Float,可以通过类型判断实现:

private fun execOp(a: Any?, b: Any?, opType: TokenType): Number {
    // 先判空,可按需调整空值处理逻辑
    requireNotNull(a) { "左操作数不能为空" }
    requireNotNull(b) { "右操作数不能为空" }
    
    // 两个操作数均为Int的场景
    if (a is Int && b is Int) {
        return when(opType) {
            TokenType.PLUS -> a + b
            TokenType.MINUS -> a - b
            TokenType.MUL -> a * b
            // 如果需要Int除法取整就保留,需要浮点结果就转Float运算
            TokenType.DIV -> a / b 
            else -> throw IllegalArgumentException("不支持的运算符类型")
        }
    }
    // 存在Float的场景统一转Float运算
    val aFloat = if (a is Int) a.toFloat() else a as Float
    val bFloat = if (b is Int) b.toFloat() else b as Float
    return when(opType) {
        TokenType.PLUS -> aFloat + bFloat
        TokenType.MINUS -> aFloat - bFloat
        TokenType.MUL -> aFloat * bFloat
        TokenType.DIV -> aFloat / bFloat
        else -> throw IllegalArgumentException("不支持的运算符类型")
    }
}

修改原代码调用即可:

return execOp(visit(node.left), visit(node.right), node.op.type)

注意事项

  • 如果需要除法默认返回浮点数,就算两个操作数都是Int也可以直接转Float运算,避免Int除法取整的问题。
  • 你已经明确visit()返回值只会是Int或Float,所以上述类型转换不会有额外的安全风险,如果后续扩展其他数值类型,补充when分支即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:07