2012-03-22 85 views
18

据我所知,在Java中,我可以如何将java.lang.Object转换为Scala中的特定类型?

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不起作用。

回答

25

如果绝对有 - 对于可以兼容Java库,例如,你可以使用以下命令:

val s: String = o.asInstanceOf[String] 

一般来说,虽然asInstanceOf是一个代码味道,应该避免。

+0

似乎工作。是的,我绝对需要这个 - 为了与Java库兼容。谢谢。 – Ivan 2012-03-22 03:55:27

10

下面是做这件事的一种安全的方式:

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) 
+0

在某些情况下,我觉得这可能是矫枉过正,'asInstanceOf'就好 - 例如。使用'readObject'进行反序列化时,当你遇到使用预泛型Java集合的库等时,我认为这是其中的一种情况。 – 2012-03-22 21:11:47

5

对于有这个问题,Travi未来的人着想先前的答案是正确的,可用于例如在Yamlbeans中将非Desearialized对象映射到地图,例如:

val s: java.util.Map[String,String] = obj.asInstanceOf[java.util.Map[String,String]] 

我希望这个小小的评论能够在将来作为我在这里找到的答案的详细信息提供给大家。

相关问题