2012-03-22 86 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]] 

我希望這個小小的評論能夠在將來作爲我在這裏找到的答案的詳細信息提供給大家。

相關問題