我正在为自定义无类型表达式创建一个新的抽象语法树,我想在其上重新定义==运算符,如下所示:
trait Expression {
def ==(other: Expression): Expression = Equality(this, other)
def !=(other: Expression): Expression = Inequality(this, other)
}
case class Equality(e1: Expression, e2: Expression) extends Expression
case class Inequality(e1: Expression, e2: Expression) extends Expression
case class Integer(e: Int) extends Expression
case class Boolean(e: Boolean) extends Expression
我现在遇到的唯一问题是测试这种表达式的无效性。 例如,当我写这篇文章时:
val formula: Expression = someFunctionReturingAnExpression
if(formula != null) {
... use the formula.
}
它会抛出java.lang.NullPointerException
,因为它正在将方法!=
应用于formula
。
关于如何具有!=
的可表达性以及空检查的任何好主意?
答案 0 :(得分:2)
那里的==
,!=
运营商正在超载。你展示的代码并没有真正为我编译,因为它无法在if子句中将Expression转换为Boolean。因此,您可以在null上使用向下转换,以便编译器使用==
中的Any
运算符:
if (formula != null.asInstanceOf[Any]) {
println("hello")
}
上述表达对我有用。
您还可以使用AnyRef
中的引用相等运算符:
if (formula eq null) {
println("hello")
}
if (formula ne null) {
println("!hello")
}
我还订阅了ziggystar和Dylan的评论 - 你应该使用不同的运营商名称(例如===
)而不要使用null
- 而是使用Option
。