我有以下情况:
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:_*)
}
在Scala 2.8.0中这很好用,我可以创建一个新的TupleTy实例:
TupleTy(IntTy(false))
但是,我刚刚更新到Scala 2.9.1 final,它不再有效。我现在收到以下错误:
error: type mismatch;
found : IntTy
required: Boolean
TupleTy(IntTy(false))
^
这是一个错误还是我错过了某些东西?
答案 0 :(得分: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))
答案 1 :(得分:3)
使用“new”创建你的TupleTy(就像常规类一样)有效:
scala> new TupleTy(IntTy(false))
res3: TupleTy = TupleTy(false,WrappedArray(IntTy(false)))
案例类的其他构造函数需要使用“new”调用,因为(与默认构造函数不同)不会“转换”到随播对象上的apply方法。 请注意,“unapply”也不会生成,因此TupleTy上的模式匹配可能无法正常工作。
这里有一些background discussion on scala-lang.org,为什么scala编译器没有被扩充来处理多个case case构造函数。
编辑如果您愿意,可以自行创建额外的“申请”:
object TupleTy {
def apply(elems: Type*) = new TupleTy(false, elems:_*)
}
,你可以这样做:
scala> TupleTy(IntTy(false))
res4: TupleTy = TupleTy(false,WrappedArray(IntTy(false)))