在Scala中从XStream反序列化XML而不使用asInstanceOf?

在Scala中从XStream反序列化XML而不使用asInstanceOf?,scala,xstream,Scala,Xstream,我在Scala应用程序中使用以下薄包装: import com.thoughtworks.xstream._ object SXStream { private val xstream = new XStream def fromXML[T](xml: String): T = { xstream.fromXML(xml).asInstanceOf[T] } def toXML[T](obj: T): String = { xstream.toXML(ob

我在Scala应用程序中使用以下薄包装:

import com.thoughtworks.xstream._

object SXStream {
  private val xstream = new XStream

  def fromXML[T](xml: String): T = {
    xstream.fromXML(xml).asInstanceOf[T]
  } 

  def toXML[T](obj: T): String = {
    xstream.toXML(obj)
  } 
}   

这是我能得到的最好的吗?还是有什么办法可以代替
呢?在Java中,casting似乎是推荐的用法;我想知道Scala是否为我提供了一些更干净的选择。

您可以避免使用
作为
的替代,但其优点是有限的——代码变得更为惯用,您可以使
ClassCastException
更加具体:

def any(xml: String): Any = xml
def fromXML[T: ClassTag](xml: String): T = any(xml) match {
  case a: T => a
  case other => throw new RuntimeException("Invalid type " + other.getClass + " found during marshalling of xml " + xml)
}

另一方面,这比
asInstanceOf
调用更冗长,效率可能更低。

应使用
ClassTag
TypeTag
而不是
Manifest
。自从Scala 2.10以来,它就被弃用了。谢谢你的建议。我做了那个改变。@yakshaver,从什么时候开始,你可以在模式匹配中匹配类型
T
。类型擦除不是完全击败了您的尝试吗?@wheaties,如果您提供
ClassTag
TypeTag
,Scala允许在泛型类型上进行模式匹配,就像示例中一样。当我尝试使用它时,我得到了错误
com.thoughtworks.xstream.mapper.CannotResolveClassException
,我遗漏了什么?。。。