如何将java.lang.Object转换为Scala中的特定类型?

时间:2012-03-22 03:40:39

标签: scala casting

据我所知,在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不起作用。

3 个答案:

答案 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]]

我希望这个小评论在将来可以作为我在这里找到的答案的详细信息。