Scala错误类型子类型的表达式不符合预期的类型T

时间:2018-09-06 23:39:17

标签: scala generics inheritance

这段代码无法编译,出现以下错误:
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...")

1 个答案:

答案 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)
}