看起来类型推断在这里起作用

时间:2017-08-14 03:41:18

标签: scala

我有以下代码:

trait A {
  def x: Option[Int]
  def y: Option[String]
}

case class A1(
    override val x: Option[Int] = Some(1),
    override val y: Option[String] = Some("abc")
) extends A

case class A2() extends A {
  override val x = Some(1)
  override val y = Some("abc")
}

在A1的定义中,我必须指定x和y的类型,它们是Option [Int]和Option [String],

x: Option[Int]val y: Option[String]

但我不必指定A2的类型

有人可以帮助我为A1而不是A2吗?

1 个答案:

答案 0 :(得分:2)

这是因为您在case类的构造函数中创建了trait A的重写值。在A2中,您在类主体中覆盖它们,这使它们就像任何其他类成员一样。请记住,你不能写这样的东西

case class A1(val x = Some(1), val y = Some("Asdf")) extends A

因为你需要为你的构造函数参数赋予类型,所以它只是普通的Scala(以及一般的编程)语义,这就是为什么你不能做你想要做的事情。