有没有办法使用两个任意类型的变量来执行addition/subtraction/multiplication/subtraction?这两个Any类型可以是Int或Float,它们可能是也可能不是相同的类型(因此一个类型可以是Int,另一个类型可以是Float,或者它们都可以是Int或Float)。
我的部分代码:
// 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:,后面跟着一长串由+运算符支持的类型。
发布于 2021-11-15 17:00:07
可以将节点类型设置为Number而不是Any吗?然后,您可以对返回的项使用toFloat(),以便能够对它们执行算术运算。
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值的情况下返回什么……
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。
发布于 2021-11-15 17:00:00
https://stackoverflow.com/questions/69978000
复制相似问题