Scala 将特征导入工作表时出错

Scala 将特征导入工作表时出错,scala,Scala,我在包中的不同文件中有以下对象和特征定义 object Bloxorz extends App // in Bloxorz.scala trait Solver extends GameDef // in Solver.scala trait GameDef // in GameDef.scala trait GameDef中有一个方法我想测试一下。因此,我在包的根目录中创建了一个工作表,并尝试导入它 import streams.GameDef._

我在包中的不同文件中有以下对象和特征定义

object Bloxorz extends App   // in Bloxorz.scala
trait Solver extends GameDef   // in Solver.scala
trait GameDef                  // in GameDef.scala
trait GameDef
中有一个方法我想测试一下。因此,我在包的根目录中创建了一个工作表,并尝试导入它

import streams.GameDef._
但是我收到以下错误

object GameDef is not a member of package streams. Note: trait GameDef exists, but it has no companion object
由于
Solver
扩展了
GameDef
,我想我需要导入
Solver
,但这产生了相同的错误。仅导入
Bloxorz
对象不会引发错误,但不会暴露我在
GameDef
中需要的方法。请尝试以下操作:

import streams.GameDef
上面的代码正在导入名为GameDef的包的所有类。我猜GameDef是一个类、对象或特征,因为它是大写的。事实上,您遇到的错误很好地描述了您的问题:


对象GameDef不是包流的成员。注意:trait GameDef存在,但它没有伴生对象

我根据您所说的和我的假设创建了代码片段。我以为你只想测试Pos,而不是GameDef

GameDef.scala:

package test

trait GameDef {
    case class Pos(x: Int, y: Int) {
         // Pos will play with x and y here.
    }
}
yoursheet.sc:

package test

object TestPosInsideGameDef extends GameDef {
    def newPos(x: Int, y: Int): Pos = new Pos(x, y)

    val pos = newPos(1, 2)
}

你是说你在测试套件中导入了<代码>吗?不是测试套件,只是一个普通的临时工作表。我已经在BloxorzSuite.scala中实现了测试,但是我想要一个临时工作表,只是用来玩,不一定要正式编写测试。谢谢。尝试了,但GameDef中的类没有公开。我在
GameDef
中有一个
case类Pos(x:Int,y:Int)
。我试图在工作表中将这个类实例化为
valp=Pos(2,3)
,但产生了错误
notfound:type Pos
。我尝试扩展
GameDef
object streamsCratch扩展GameDef
,但出现了一个错误,工作表无法计算。听起来像
Pos
是一个内部类。很抱歉,您能详细说明一下吗?我能做些什么来访问这个内部类呢?如果你在Java中尝试这样做(使用eclipse),你会得到一个非常描述性的错误:“没有GameDef类型的封闭实例可访问。必须使用GameDef类型的封闭实例来限定分配(例如x.new A(),其中x是GameDef的实例)。”换句话说,要创建Pos实例,首先需要创建GameDef实例:
val gd=new GameDef{…}
。然后您可以像这样创建一个Pos:
val p=new gd.Pos(2,3)
。与其公开Pos,不如创建一个GameDef实例并在其中进行测试;假设我有一个模板类,它有一个内部类:
classouterclass[T](val-foo:T){…class-InnerClass{val-bar:T=foo…}}
。在这种情况下,创建
Outer.internal
的实例是没有意义的,因为没有指定t(即未指定
bar
的类型)。一种语言可以公开它的嵌套类型(静态地?),也可以有模板类,Scala选择了后者,这是理所当然的。