加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala case class.type不接受参数

发布时间:2020-12-16 18:33:50 所属栏目:安全 来源:网络整理
导读:我是斯卡拉的新手. Here是我想写的Models.scala. 当我运行sbt包时,它给出了错误 Models.scala:25: models.Session.Network.type does not take parameters[error] network : Network = Network(), 我不明白为什么会发生这个错误,我在做Network()时没有传递任
我是斯卡拉的新手.
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方法,其具有与构造函数相同的参数列表.这包括默认值,然后在随播对象内编译.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读