在以下课程中:
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")
}
}
但是我在第import patternmatching.Expr.Var
行的PatternMain中收到编译时错误:
- object Expr不是包模式匹配的成员注意:类Expr存在,但它没有伴随对象。
如何针对案例类Var正确调用val v = Var("x")
?我没有正确导入吗?
答案 0 :(得分: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")
}
解释: