Scala'的重载构造函数;什么是病例班?

Scala'的重载构造函数;什么是病例班?,scala,constructor,overloading,scala-2.8,case-class,Scala,Constructor,Overloading,Scala 2.8,Case Class,在Scala2.8中,有没有办法重载case类的构造函数 如果是,请放一个代码段来解释,如果不是,请解释原因?您可以用通常的方式定义重载构造函数,但要调用它,必须使用“new”关键字 scala>case class A(i:Int){def this(s:String)=this(s.toInt)} 定义的A类 scala>A(1) res0:A=A(1) scala>A(“2”) :8:错误:类型不匹配; 找到:java.lang.String(“2”) 必填项:Int A(“2”) ^ s

在Scala2.8中,有没有办法重载case类的构造函数


如果是,请放一个代码段来解释,如果不是,请解释原因?

您可以用通常的方式定义重载构造函数,但要调用它,必须使用“new”关键字

scala>case class A(i:Int){def this(s:String)=this(s.toInt)}
定义的A类
scala>A(1)
res0:A=A(1)
scala>A(“2”)
:8:错误:类型不匹配;
找到:java.lang.String(“2”)
必填项:Int
A(“2”)
^
scala>新A(“2”)
res2:A=A(2)

重载构造函数对于case类并不特殊:

case class Foo(bar: Int, baz: Int) {
  def this(bar: Int) = this(bar, 0)
}

new Foo(1, 2)
new Foo(1)
但是,您可能还希望在伴生对象中重载
apply
方法,当您忽略
new
时会调用该方法

object Foo {
  def apply(bar: Int) = new Foo(bar)
}

Foo(1, 2)
Foo(1)
在Scala 2.8中,通常可以使用命名参数和默认参数来代替重载

case class Baz(bar: Int, baz: Int = 0)
new Baz(1)
Baz(1)

严格来说,这不是真的-您可以在伴生对象中将其声明为normalVery nice:)我在scala中寻找类似回退值的内容,它是2.8版的新版本吗?我不知道:)是的,命名参数和默认参数在Scala 2.8中是新的。Martin Odersky解释了为什么没有自动添加附加的apply方法:以及如何在重载构造函数中使用局部变量?例如:
def this(bar:Int)={val test=0;this(bar,test)}
(这不起作用)二级构造函数
case class Baz(bar: Int, baz: Int = 0)
new Baz(1)
Baz(1)