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

