Scala case class.type不接受参数

时间:2014-11-05 21:31:55

标签: scala

我是斯卡拉的新手。 Here是我想写的Models.scala。 当我运行sbt包时,它给出了错误

Models.scala:25: models.Session.Network.type does not take parameters
[error]         network : Network = Network() ,

我不明白为什么会发生这个错误,我在做Network()时没有传递任何参数。有人可以帮助我吗

2 个答案:

答案 0 :(得分:2)

这是一个较小的代码,可以重现您的问题:

case class A(b:B = B(3, 5))

case class B(i: Int, j: Int)

object A {

  val B = "whatever"
}

在第一行,我们得到

too many arguments for method apply: (index: Int)Char in class StringOps    

当您定义案例类的签名时,您既要定义构造函数的签名(使用new调用时),也要定义随播对象中的apply方法(当您调用new时) 。

当您将默认值放在参数中时,(代码中的Network()和我的B(3,5)),此代码将在构造函数的上下文和随播的apply方法中编译宾语。

在定义了伴随对象Session后,apply方法会自动添加到此对象中。碰巧伴侣对象中的Network()意味着您在那里定义的Network对象上的Network.apply(),它意味着字符串B的值为"无论"在我的代码中。

真正奇怪的是,默认表达式可能具有不同的含义,但在构造函数和apply方法的上下文中都是正确的。在这种情况下,您可能会获得不同的行为,具体取决于您是否使用新呼叫。

以下是一个例子:

case class A(b:B = bb)

case class B(i: Int, j: Int)

object bb extends B(3, 4)

object A {

  val bb = new B(7, 2)
}


object Test extends App {

  println(A())
  println(new A())

}

运行测试将打印

A(B(7,2))
A(B(3,4))

针对您的具体问题,有一些简单的解决方法。

network: Network = models.Network(),
显然,

会起作用,因为很明显你想要包中的Network而不是对象Session。

network: Network = new Network(),

也可以工作,因为使用new,编译器将查找网络类型而不是网络值。在伴随对象会话中,网络值由本地声明遮蔽,但网络类型不是。

IMO,前者(models.Network)更清晰。


PS。我检查了规范,我相信这种奇怪的行为符合它。即,(5.3.2)在伴随对象内部创建apply方法,其具有与构造函数相同的参数列表。这包括默认值,然后在随播对象内编译。

答案 1 :(得分:0)

看起来您可能正在进行一些导入替换。你在代码中的某个地方有一个导入Sessions._吗?请注意,您的错误是指Session.Network,它是您隐式的BSonDocument类。您可能正在尝试构建普通的案例类。

尝试明确使用网络:network:models.Network = models.Network()