首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于addition/subtraction/multiplication/subtraction,Kotlin使用两个可以是整型或浮点型的Any类型

对于addition/subtraction/multiplication/subtraction,Kotlin使用两个可以是整型或浮点型的Any类型
EN

Stack Overflow用户
提问于 2021-11-15 16:49:44
回答 2查看 54关注 0票数 0

有没有办法使用两个任意类型的变量来执行addition/subtraction/multiplication/subtraction?这两个Any类型可以是Int或Float,它们可能是也可能不是相同的类型(因此一个类型可以是Int,另一个类型可以是Float,或者它们都可以是Int或Float)。

我的部分代码:

代码语言:javascript
复制
// this.visit() returns Any?
// node.left and node.right can be Int or Float, and they may or may not be the same type
when (node.op.type) {
  TokenType.PLUS -> return this.visit(node.left) + this.visit(node.right)
  TokenType.MINUS -> return this.visit(node.left) - this.visit(node.right)
  TokenType.MUL -> return this.visit(node.left) * this.visit(node.right)
  TokenType.DIV -> return this.visit(node.left) / this.visit(node.right)
}

在这段代码中,它不会编译和输出Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:,后面跟着一长串由+运算符支持的类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-15 17:00:07

可以将节点类型设置为Number而不是Any吗?然后,您可以对返回的项使用toFloat(),以便能够对它们执行算术运算。

代码语言:javascript
复制
val left = visit(node.left).toFloat()
val right = visit(node.right).toFloat()
return when (node.op.type) {
  TokenType.PLUS -> left + right
  TokenType.MINUS -> left - right
  TokenType.MUL -> left * right
  TokenType.DIV -> left / right
}

我刚刚注意到你说返回值可以为空,所以你需要决定在没有left或right值的情况下返回什么……

代码语言:javascript
复制
val left = visit(node.left)?.toFloat()
val right = visit(node.right)?.toFloat()
if (left == null || right == null) {
    //...
    //return ...
}
return when (node.op.type) {
  TokenType.PLUS -> left + right
  TokenType.MINUS -> left - right
  TokenType.MUL -> left * right
  TokenType.DIV -> left / right
}

如果必须将节点类型保持为Any,则可以在使用toFloat()之前将其强制转换为Number,但如果它们可能不是numbers,则必须使用安全强制转换并决定如何处理non-numbers。

票数 3
EN

Stack Overflow用户

发布于 2021-11-15 17:00:00

最简单的方法是将两者都转换为浮点数,然后执行相应的操作并返回,如:

代码语言:javascript
复制
(8f).toFloat() + (10L).toFloat()

try it yourself

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69978000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档