在以下课程中:
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") } }
但是我在行导入patternmatching.Expr.Var的PatternMain中收到编译时错误:
- object Expr is not a member of package patternmatching Note: class Expr exists,but it has no companion object.
如何针对案例类Var正确调用val v = Var(“x”)?我没有正确导入它吗?
解决方法
删除abstract关键字并将类Expr转换为对象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") }
说明:
>只有对象和包可以导入其成员>必须扩展抽象类才能实例化.这里的想法是,类中的一些“point(s)”需要由客户端定义,同时仍然与抽象类的其他扩展共享其余的接口.