据我所知,在Java中我可以
Object o = new String("abc")
String s = (String) o
但是如何在Scala中重写它?
val o: java.lang.Object = new java.lang.String("abc")
val s: String = // ??
我想要使用的Java库返回java.lang.Object
,我需要将其转换为更具体的类型(也在此库中定义)。 Java示例与我的第一个示例完全相同,但仅使用Scala的source: TargetType
而不是Java的(TargetType)source
不起作用。
答案 0 :(得分:26)
如果您绝对必须 - 与Java库兼容,例如 - 您可以使用以下内容:
val s: String = o.asInstanceOf[String]
一般来说,asInstanceOf
是一种代码气味,应该避免使用。
答案 1 :(得分:11)
这是一种安全的方法:
val o: java.lang.Object = new java.lang.String("abc")
o match { case s: String => /* do stuff with s */ }
如果您需要返回结果,这也适用:
import PartialFunction._
def onlyString(v: Any): Option[String] = condOpt(v) { case x: String => x }
val s: Option[String] /* it might not be a String! */ = onlyString(o)
答案 2 :(得分:5)
为了将来有这个问题的人,Travi以前的答案是正确的,例如可以在Yamlbeans中使用,将Desearialized对象映射到地图,例如:
val s: java.util.Map[String,String] = obj.asInstanceOf[java.util.Map[String,String]]
我希望这个小评论在将来可以作为我在这里找到的答案的详细信息。