我是斯卡拉的新手。 Here是我想写的Models.scala。 当我运行sbt包时,它给出了错误
Models.scala:25: models.Session.Network.type does not take parameters
[error] network : Network = Network() ,
我不明白为什么会发生这个错误,我在做Network()时没有传递任何参数。有人可以帮助我吗
答案 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()