Мне нужно определить группу схожих перечислений:
object Color extends MyEnum[Color.Color] {
type Color = Value
val Red, Green, Periwinkle = Value
}
object Shape extends MyEnum[Shape.Shape] {
type Shape = Value
val Square, Circle, Balbis = Value
}
Я бы хотел извлечь разделяемую функциональность в абстрактный класс или черту для поддержки 1) apply
и unapply
методов,и 2) неявные преобразования из перечислений в их строковые представления:
abstract class MyEnum[T] extends Enumeration {
implicit def valueToString(value: T): String = value.toString
implicit def stringToValue(string: String): T = apply(string)
def unapply(arg: String): Option[T] =
values.find(_.toString == arg).map(_.asInstanceOf[T])
def apply(arg: String): T =
values.find(_.toString == arg)
.getOrElse(sys.error(s"Invalid value '$arg'"))
.asInstanceOf[T]
}
Это не компилируется;когда я добавляю параметр типа в MyEnum[Color.Color]
, он по какой-то причине нарушает тип Value
.
Есть ли какой-то способ получить то, что я хочу, с помощью этого синтаксиса enum, или мне нужно переключиться нарешение кейс-объекта (или что-то более сложное)?