2012-07-30 16 views

Respuesta

34

Puede hacer a.get.asInstanceOf[Int], pero no es seguro. Una mejor manera sería retener la información del tipo, es decir, utilizando un Option[Int] en lugar de un Option[Any]. Entonces no necesitarías lanzar el resultado con asInstanceOf.

val a:Option[Int] = Some(1) 
val i = a.get 

Usando get es directamente peligroso ya que si el Option es una None se produce una excepción. Entonces, usar getOrElse es más seguro. O puede usar la coincidencia de patrones en a para obtener el valor.

val a:Option[Any] = Some(1) // Note using Any here 
val i = (a match { 
    case Some(x:Int) => x // this extracts the value in a as an Int 
    case _ => Int.MinValue 
}) 
+1

Olvídate de la cuestión del casting; coincidencia de patrones es claramente la manera de ir –

+0

Estoy de acuerdo. La coincidencia de patrones es muy poderosa e impresionante :) –

12

Usando .asInstanceOf método

a.getOrElse(0).asInstanceOf[Int] 

Tengo que tener en cuenta que esto es inseguro elenco: si su Opción no contiene Int, obtendrá runt excepción de ime

3

La razón por la que no puedes lanzar es porque no debes lanzar. Si bien los lenguajes de programación estáticos mecanografiados le permiten convertir manualmente entre un tipo y el otro, la mejor sugerencia que le puedo dar es que se olvide de estas características.

En particular, si desea obtener lo mejor de cada lenguaje de programación, intente hacer un usuario adecuado, y si un idioma no se ajusta al uso que desea simplemente elija otro (como uno de tipo dinámico) :

Si haces proyecta haces de un posible error en tiempo de compilación, que como porque es fácil de resolver, en un ClassCastException, que no nos gusta porque se produce en tiempo de ejecución. Si necesita utilizar yesos en Scala, es muy probable que esté utilizando un patrón incorrecto.

+3

O está utilizando bibliotecas Java (mal diseñadas) ... – ziggystar

+2

Si bien aprecio el sentimiento, en los proyectos de la vida real, las cosas no siempre son en blanco y negro. Hay una necesidad legítima para mí de hacer esto, ya que podría ser uno de los 4 tipos devueltos por la API de terceros subyacente. – Bob

+0

Este es un mecanismo muy débil. Puede hacer lo mismo con mejores patrones, probablemente ... ¿Por qué no intenta explicar lo que quiere hacer? – Edmondo1984