在我的应用程序中,我有多个案例类和对象,它们是密封特征层次结构的一部分。我在 Akka 中将它们用作消息。
在通过 websocket 发送之前,这些类需要转换为用户友好的形式。
以前我使用大模式匹配在单个位置转换它们,但随着类型数量的增长,我想使用隐式转换:
object Types {
sealed trait Type
case object SubType1 extends Type
case object SubType2 extends Type
case object SubType3 extends Type
trait Converter[T] {
def convert(t: T): Int
}
}
object Implicits {
import Types._
implicit object Type1Coverter extends Converter[SubType1.type] {
override def convert(t: SubType1.type): Int = 1
}
implicit object Type2Coverter extends Converter[SubType2.type] {
override def convert(t: SubType2.type): Int = 2
}
implicit object Type3Coverter extends Converter[SubType3.type] {
override def convert(t: SubType3.type): Int = 3
}
}
object Conversion {
import Types._
def convert[T: Converter](t: T): Int = {
implicitly[Converter[T]].convert(t)
}
def convert2[T <: Type](t: T)(implicit ev1: Converter[SubType1.type], ev2: Converter[SubType2.type], ev3: Converter[SubType3.type]): Int = {
t match {
case t1@SubType1 =>
implicitly[Converter[SubType1.type]].convert(t1)
case t2@SubType2 =>
implicitly[Converter[SubType2.type]].convert(t2)
case t3@SubType3 =>
implicitly[Converter[SubType3.type]].convert(t3)
}
}
}
我想按如下方式使用它们:
import Types._
import Conversion._
import Implicits._
val t1 = SubType1
val x1: Int = convert(t1)
val t: Type = SubType2 // T is of type Type
//Is it possible to handle that?
//val x: Int = convert(t)
val y: Int = convert2(t)
我很想知道是否有任何“神奇”的方式可以在convert2
不编写宏的情况下自动生成类似的东西。也许已经有一个提供这样宏的库?