Scala case class.type不接受参数
我是斯卡拉的新手.
Here是我想写的Models.scala. 当我运行sbt包时,它给出了错误 Models.scala:25: models.Session.Network.type does not take parameters [error] network : Network = Network(), 我不明白为什么会发生这个错误,我在做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 会发生的情况是,当您定义案例类的签名时,您既要定义构造函数的签名(当您使用new调用时),也要定义随播对象中的apply方法(当您使用new调用时). 当你将默认值放在参数中时,(代码中的Network()和我的B(3,5)),这个代码将在构造函数和伴随对象的apply方法的上下文中编译. 在定义了伴随对象Session后,apply方法会自动添加到此对象中.碰巧伴随对象中的Network()意味着您在那里定义的Network对象上的Network.apply(),它意味着字符串B在我的代码中具有值“whatever”. 真正奇怪的是,默认表达式可能具有不同的含义,但在构造函数和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方法,其具有与构造函数相同的参数列表.这包括默认值,然后在随播对象内编译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |