在Scala中从XStream反序列化XML而不使用asInstanceOf?
我在Scala应用程序中使用以下薄包装:在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
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
,我遗漏了什么?。。。