4

在下面的课程中:

package patternmatching

abstract class Expr {

  case class Var(name: String) extends Expr
  case class Number(num: Double) extends Expr
  case class UnOp(operator: String, arg:Expr) extends Expr
  case class BinOp(operator: String, left: Expr, right: Expr) extends Expr


}

我将主类定义为:

package patternmatching
import patternmatching.Expr.Var

object PatternMain {

      def main(args:Array[String]) {

         val v = Var("x")
    }

}

但是我在 PatternMain 中收到一个编译时错误import patternmatching.Expr.Var

  • object Expr 不是包模式匹配的成员 注意:类 Expr 存在,但它没有伴生对象。

如何正确调用val v = Var("x")案例类 Var ?我没有正确导入它吗?

4

1 回答 1

7

删除abstract关键字并将其class Expr变为object Expr. 就您的代码而言,我认为没有理由不进行这些更改。

但是,如果您确实想保留Expr一个抽象类,则必须扩展和实例化它:

def main(args:Array[String]) {
    val expr = new Expr {} // extending the class - this creates a anonymous class
    val v = expr.Var("x")

    // alternatively, since now we do have a object to import
    import expr._
    val v2 = Var("x")

    // even another approach, now using a named class
    class MyExpr extends Expr
    val myexpr = new MyExpr
    val v3 = myexpr.Var("x")
}

说明:

  • 只有对象和包可以导入其成员
  • 抽象类必须被扩展才能被实例化。这里的想法是,类中的某些“点”将需要由客户端定义,同时仍与抽象类的其他扩展共享接口的其余部分。
于 2012-10-17T22:14:42.673 回答