Конструктор класса дел Scala с аргументом WrappedArray - PullRequest
1 голос
/ 02 сентября 2011

У меня есть следующий сценарий:

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, и он больше не работает. Теперь я получаю следующую ошибку:

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

Это ошибка или я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 02 сентября 2011

Я не уверен, что это работает в 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 голосов
/ 02 сентября 2011

создание вашего TupleTy с помощью «new» (как с обычным классом) работает:

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

дополнительные конструкторы для классов case необходимо вызывать с помощью «new», потому что (в отличие от конструктора по умолчанию)не переводиться в метод apply объекта-компаньона.Обратите внимание, что «unapply» также не генерируется, поэтому сопоставление с образцом на вашем TupleTy может работать не так, как задумано.

Вот некоторые справочные обсуждения на scala-lang.org о том, почемуКомпилятор scala не был расширен для обработки нескольких конструкторов класса case.

EDIT вы можете создать дополнительное "apply" самостоятельно, если хотите:

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

счто вы можете сделать:

scala> TupleTy(IntTy(false))
res4: TupleTy = TupleTy(false,WrappedArray(IntTy(false)))
...