带有WrappedArray参数的Scala案例类构造函数

时间:2011-09-02 14:18:20

标签: scala scala-2.8 scala-2.9

我有以下情况:

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))
                           ^

这是一个错误还是我错过了某些东西?

2 个答案:

答案 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)))