gpt4 book ai didi

scala - 从对象中的主要方法调用案例类

转载 作者:行者123 更新时间:2023-12-04 23:59:07 26 4
gpt4 key购买 nike

在下面的类(class)中:

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 is not a member of package patternmatching Note: class Expr exists, but it has no companion object.


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

最佳答案

删除 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")
}

说明:
  • 只有对象和包可以导入其成员
  • 抽象类必须被扩展才能被实例化。这里的想法是,类中的某些“点”将需要由客户端定义,同时仍与抽象类的其他扩展共享接口(interface)的其余部分。
  • 关于scala - 从对象中的主要方法调用案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12943995/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com