2012-03-22 8 views
18

Por lo que yo sé, en Java que puedoCómo lanzar java.lang.Object a un tipo específico en Scala?

Object o = new String("abc") 
String s = (String) o 

Pero, ¿cómo volver a escribir en Scala?

val o: java.lang.Object = new java.lang.String("abc") 
val s: String = // ?? 

Una biblioteca de Java Quiero utilizar retornos java.lang.Object que necesito para echar a un tipo más específico (también definida en esta biblioteca). Un ejemplo de Java lo hace exactamente igual que el primer ejemplo mío, pero el simple hecho de usar el source: TargetType de Scala en lugar del (TargetType)source de Java no funciona.

Respuesta

25

Si absolutamente necesario para la compatibilidad -por con una biblioteca de Java, por ejemplo, se puede usar la siguiente:

val s: String = o.asInstanceOf[String] 

En general, sin embargo, asInstanceOf es un olor de código y debe ser evitado.

+0

Parece que funciona. Y sí, absolutamente lo necesito, para compatibilidad con una biblioteca Java. Gracias. – Ivan

10

Aquí está una manera segura de hacerlo:

val o: java.lang.Object = new java.lang.String("abc") 
o match { case s: String => /* do stuff with s */ } 

Si necesita devolver el resultado, esto funciona así:

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

En algunos casos, siento que esto es probablemente excesivo, y 'asInstanceOf' está bien, por ejemplo. deserializando con 'readObject', cuando está atascado con bibliotecas que usan colecciones de Java pregenéricas, etc. Asumí que este era uno de esos casos. –

5

Por el bien de la gente del futuro que tienen este problema, Travi de respuesta anterior es correcta y se puede utilizar por ejemplo en Yamlbeans para mapear objetos Desearialized a Mapas hacer algo como:

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

Espero que este pequeño comentario sea útil para uno en el futuro como detalle de la respuesta que encontré aquí.

Cuestiones relacionadas