2010-03-08 12 views

답변

151

과부하 생성자의 경우 클래스에 대한 특별한되지 않습니다 : 그러나

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

new Foo(1, 2) 
new Foo(1) 

, 당신은 또한 당신이 new을 생략 할 때 호출되는 동반자 객체의 apply 방법에 과부하를하실 수 있습니다.

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

Foo(1, 2) 
Foo(1) 

는 스칼라 2.8에서, 이름 및 기본 매개 변수는 종종 대신에 과부하를 사용할 수 있습니다. 엄격하게 사실이 아니다

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

아주 좋은 :)대로 동반자 객체를 선언 할 수 있습니다, 그것은 2.8의 새로운입니까? 나도 몰랐어 :) – Felix

+0

예, 명명 된 및 기본 매개 변수는 스칼라 2.8에서 새로 추가되었습니다. – retronym

+7

Martin Odersky가 추가 적용 방법이 자동으로 추가되지 않는 이유를 설명합니다. http://www.scala-lang.org/node/976 –

17

오버로드 된 생성자는 일반적인 방법으로 정의 할 수 있지만 호출하려면 "new"키워드를 사용해야합니다.

scala> case class A(i: Int) { def this(s: String) = this(s.toInt) } 
defined class A 

scala> A(1) 
res0: A = A(1) 

scala> A("2") 
<console>:8: error: type mismatch; 
found : java.lang.String("2") 
required: Int 
     A("2") 
     ^

scala> new A("2") 
res2: A = A(2) 
+2

- 나는 스칼라에서 대체 값 같은 것을 찾고 있었다 정상 –