2011-09-02 6 views
1

나는 다음과 같은 시나리오가 :스칼라의 경우 클래스 생성자

스칼라 2.8.0 이것은 잘 작동
sealed abstract class Type(val inUse: Boolean) 

case class IntTy(override val inUse: Boolean) extends Type(inUse) 

case class TupleTy(override val inUse: Boolean, elems: Type*) extends Type(inUse) { 
    def this(elems: Type*) = this(false, elems:_*) 
} 

내가 가진 새로운 TupleTy 인스턴스를 만들 수 있습니다 그러나

TupleTy(IntTy(false)) 

을 , 나는 스칼라 2.9.1 최종본으로 업데이트했고 더 이상 작동하지 않습니다. 이제 다음과 같은 오류가 발생합니다 :

error: type mismatch; 
found : IntTy 
required: Boolean 
       TupleTy(IntTy(false)) 
         ^

이것은 버그입니까 아니면 제가 실종 된 것이 있습니까?

+0

내가 사용중 a를 제공하기 위해 제안하고 있었다 그러나 :'error : '*'- 매개 변수가있는 매개 변수 섹션은 기본 인수를 가질 수 없습니다. ':-(글쎄, 잘 알고 있습니다. – PhiLho

답변

5

2.8.0에서 작동하는지 잘 모르겠습니다.

추가 생성자를 정의했지만 추가 팩토리 메소드는 정의하지 않았습니다.

new TupleTy(IntTy(false)) // works as expected 

편집 여기

은 가능한 해결 방법 이제

case class TupleTy(override val inUse: Boolean = false)(elems: Type*) extends Type(inUse) 

이 같은 추악한 일을 할 수 있습니다,하지만 당신은 안된다. 정말로, 당신은해서는 안됩니다.

TupleTy()(IntTy(false)) 
3

(일반 클래스와 같은) "새로운"로 TupleTy을 만들어 작동 :

scala> new TupleTy(IntTy(false)) 
res3: TupleTy = TupleTy(false,WrappedArray(IntTy(false))) 

추가 생성자를 경우에 클래스가 있기 때문에 (기본 생성자는 달리, "새로운"호출 할 필요가)는 동반자 객체의 적용 메소드로 "변환"되지 않습니다. "적용 취소"도 생성되지 않으므로 TupleTy의 패턴 일치가 의도 한대로 작동하지 않을 수 있습니다.

여기 scala 컴파일러가 여러 사례 클래스 생성자를 처리하기 위해 추가되지 않은 이유는 다음과 같습니다. background discussion on scala-lang.org 당신이 원하는 경우에, 자신을 "적용"추가 생성 할 수 있습니다

편집 : 그와

object TupleTy { 
    def apply(elems: Type*) = new TupleTy(false, elems:_*) 
} 

, 당신은 할 수 있습니다 :

scala> TupleTy(IntTy(false)) 
res4: TupleTy = TupleTy(false,WrappedArray(IntTy(false))) 
관련 문제