0

我正在为自定义无类型表达式创建一个新的抽象语法树,我想在其上重新定义 == 运算符,如下所示:

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.

关于如何具有可表达性!=以及空检查的任何好主意?

4

1 回答 1

2

您在那里重载了==,!=运算符。您显示的代码并没有真正为我编译,因为它无法在 if 子句中将 Expression 转换为 Boolean。因此,您可以在那里对 null 使用向下转换,以便编译器使用==操作符 from 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来代替。

于 2012-11-28T13:23:16.933 回答