【问题标题】:Error importing trait in to worksheet将特征导入工作表时出错
【发布时间】:2017-02-25 21:27:36
【问题描述】:

我的包中的单独文件中有以下对象和特征定义

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?
  • 不是测试套件,只是一个常规的临时工作表。我已经在 BloxorzSuite.scala 中实现了测试,但我想要一个临时工作表只是为了玩,不一定要正式编写测试。

标签: scala


【解决方案1】:

试试这个:

import streams.GameDef

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

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

【讨论】:

  • 谢谢。试过了,但 GameDef 里面的类没有暴露。我在GameDef 中有一个case class Pos(x:Int, y:Int)。我尝试在工作表中将此类实例化为val p = Pos(2,3),但会产生错误not found: type Pos。我尝试像object streamsscratch extends GameDef 一样扩展GameDef,但出现一闪而过的错误并且工作表无法评估。
  • 听起来Pos是一个内部类。
  • 很抱歉,您能详细说明一下吗?我该怎么做才能访问这个内部类?
  • 如果你尝试在 Java 中做同样的事情(使用 eclipse),你会得到非常描述性的错误:“没有 GameDef 类型的封闭实例是可访问的。必须用封闭来限定分配GameDef 类型的实例(例如 xnew A(),其中 x 是 GameDef 的实例)。”也就是说,要创建 Pos 的实例,首先需要创建 GameDef 的实例:val gd = new GameDef {...}。然后,您可以像这样创建一个 Pos:val p = new gd.Pos(2,3)。您可能希望创建一个 GameDef 实例并在其中进行测试,而不是公开 Pos。
  • 详细说明内部类不能暴露的原因;假设我有一个带有内部类的模板类:class OuterClass[T](val foo:T) {... class InnerClass{ val bar:T = foo... } }。在这种情况下,创建Outer.Inner 的实例是没有意义的,因为没有指定 T(即没有指定 bar 的类型)。有理由认为一种语言可以公开它的嵌套类型(静态?)或具有模板类,而 Scala 选择了后者。
【解决方案2】:

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

GameDef.scala:

package test

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

YourWorksheet.sc:

package test

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

    val pos = newPos(1, 2)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2017-12-15
    • 2014-07-26
    • 2016-02-04
    相关资源
    最近更新 更多