У меня есть следующие типы перечисления.Общая функция отображения для обработки типов перечисления
class Payment extends Enumeration {
type Payment = Value
val Cash, CreditCard, Unspecified = Value
}
object Payment extends Payment
class Ticket extends Enumeration {
type Ticket = Value
val Normal, Discount, Other = Value
}
object Ticket extends Ticket
Я объявил перечисления как классы вместо объектов, как я необходима информация о типе позже (для MappedColumnType).
Вот нерабочая версия скользких таблиц:
class Stats(tag: Tag) extends Table[Stat](tag, "STATS") {
implicit def enumToInt[E <: Enumeration : ClassTag, V : ClassTag](implicit conv: V => E#Value): BaseColumnType[V] =
MappedColumnType.base[V, Int] (
value => value.id,
num => implicitly[ClassTag[E]].runtimeClass.newInstance().asInstanceOf[E](num).asInstanceOf[V]
)
def entityid = column[Int]("ENTITYID")
def email = column[String]("EMAIL")
def payment = column[Payment]("PAYMENT")
def ticket = column[Ticket]("TICKET")
def phone = column[String]("PHONE")
def ticket_source = column[TicketSource]("TICKETSOURCE")
def * = (entityid, email, payment, ticket, phone, ticket_source) <>
(Stat.tupled, Stat.unapply)
}
Моей цель определения обобщенной функции картографа, чтобы обрабатывать все перечисления как методы преобразования справедливы для всех типов перечислений (значения для идентификатора , id для значения).
В функции mapper я попытался захватить информацию ClassTag и создать исполняемый экземпляр для вызова метода apply, который возвращает перечисление Value
. Мне пришлось добавить .asinstanceOf[V]
в результат метода apply
, в противном случае ошибка повысится примерно на E#Value
не соответствует ожидаемому значению V
. Теперь, это то, что я получаю как сообщение об ошибке:
Tables.scala:45: could not find implicit value for parameter tm: scala.slick.ast.TypedType[com.yokyer.tiyatrosever.models.Payment]
[error] def payment = column[Payment]("PAYMENT")
[error] ^
Tables.scala:46: could not find implicit value for parameter tm: scala.slick.ast.TypedType[com.yokyer.tiyatrosever.models.Ticket]
[error] def ticket = column[Ticket]("TICKET")
Я новичок в Скале, я поставил кучу рецептов о отражениях, вместе взятых, и интересно, если я делаю что-то в корне неправильно.