这段代码无法编译,出现以下错误:
MessageA类型的表达不符合预期的T类型
MessageB类型的表达不符合预期的T类型
import scala.reflect.runtime.universe._
abstract class BaseMessage
case class MessageA(x : String = "aaa") extends BaseMessage
case class MessageB(y : String = "bbbb") extends BaseMessage
val TypeA = typeTag[MessageA]
val TypeB = typeTag[MessageB]
def decode[T <: BaseMessage](xml: String)(implicit tag: TypeTag[T]): T = {
tag match {
case TypeA => MessageA()
case TypeB => MessageB()
}
}
基本上,我想解码一些xml字符串并返回相应的消息。
虽然我能做到这一点
def decode[T <: BaseMessage](xml: String)(implicit tag: TypeTag[T]): BaseMessage = {
tag match {
case TypeA => MessageA()
case TypeB => MessageB()
}
}
以上内容返回的是BaseMessage
而不是T
,我必须在呼叫站点进行强制转换。如何获得解码函数以返回T?我希望能够执行以下操作
val a: MessageA = decode[MessageA]("xml...")
val b: MessageB = decode[MessageB]("xml...")
答案 0 :(得分:1)
我认为类型标记可能会分散注意力,不需要。也许您可以创建自己的类型类,以完成创建每个这些实例所需的实际工作。例如:
trait Decoder[T <: BaseMessage] {
def decode(xml: String): T
}
implicit val messageADecoder = new Decoder[MessageA] {
def decode(xml: String): MessageA = MessageA()
}
// same for MessageB and other classes...
def decode[T <: BaseMessage](xml: String)(implicit dec: Decoder[T]): T = {
dec.decode(xml)
}