Scala case class.type不接受参数

Scala case class.type不接受参数,scala,Scala,我是scala的新手。 是一个Models.scala,我正在尝试编写。 当我运行sbt包时,它给出了一个错误 Models.scala:25: models.Session.Network.type does not take parameters [error] network : Network = Network() , 我不明白为什么会发生此错误,在执行Network()时,我没有传入任何参数。有人能帮我一下吗看来您可能正在进行一些导入覆盖。您是否有导入会话。\u代码

我是scala的新手。 是一个Models.scala,我正在尝试编写。 当我运行sbt包时,它给出了一个错误

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

我不明白为什么会发生此错误,在执行Network()时,我没有传入任何参数。有人能帮我一下吗

看来您可能正在进行一些导入覆盖。您是否有导入会话。\u代码中的某个位置?请注意,您的错误引用了Session.Network,它是您的隐式BSonDocument类。您可能正在尝试构造纯case类


尝试显式使用网络:Network:models.Network=models.Network()

下面是一个较小的代码,它再现了您的问题:

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    
当您定义case类的签名时,您既定义了构造函数的签名(当您使用new调用时),也定义了伴随对象中apply方法的签名(当您不使用new调用时)

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

当您定义了一个伴随对象会话时,apply方法将自动添加到此对象中。您的同伴对象中的Network()表示您在其中定义的Network对象上的Network.apply(),它表示代码中值为“whatever”的字符串B

那么真正奇怪的是,默认表达式可能有不同的含义,但在构造函数和apply方法的上下文中都是正确的。在这种情况下,您可能会得到不同的行为,这取决于您是使用new还是不使用new调用

以下是一个例子:

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: Network = new Network(),
也可以工作,因为使用新的,编译器将查找网络类型而不是网络值。在伴随对象会话中,网络值由本地声明隐藏,但网络类型不是

在国际海事组织,前者(models.Network)更为清晰



另外,我检查了说明书,我相信这种奇怪的行为与说明书相符。即,(5.3.2)在伴随对象内生成一个应用方法,该方法的参数列表与构造函数相同。这包括默认值,然后将在伴随对象内编译这些值

我不知道这是否符合规范和预期(因为其他行为太复杂,无法指定或实施)|符合规范,但有一项疏忽|违反规范。我将检查规范,如果仍然不清楚,请在邮件列表上询问我相信现在这符合规范。尽管如此,我还是通知了邮件列表。