Передача параметра enum в класс case не работает - PullRequest
25 голосов
/ 10 мая 2010

Может кто-нибудь сказать мне, почему это не работает?

case class XY(enum: MyEnum)

object MyEnum extends Enumeration {
  val OP1, OP2 = Value 
}

Ошибка: не найдено: введите MyEnum

1 Ответ

45 голосов
/ 10 мая 2010

Это потому, что MyEnum является объектом, а объекты - одиночными. Невозможно передать синглеты в качестве аргументов классам case, потому что это навязывает более одного экземпляра этого объекта.

Если вы хотите передать значение MyEnum (то есть значение перечисления), используйте MyEnum.Value:

case class XY(enum: MyEnum.Value)

object MyEnum extends Enumeration { val OP1, OP2 = Value }

После этого вы можете использовать MyEnum, как и ожидалось:

val x = XY(MyEnum.OP1)

Кстати: общий шаблон - это определение псевдонима типа, так что вы можете немного изменить код (т.е. использовать MyEnum вместо MyEnum.Value и OP1 вместо MyEnum.OP1):

object MyEnum extends Enumeration {
  type MyEnum = Value
  val OP1, OP2 = Value
}

import MyEnum._

case class XY(enum: MyEnum)

class C {
  val x = XY(OP1)
}
...