¿Por qué envolver una llamada de método genérico con Opción difiere ClassCastException?
Digamos que tengo una matriz como esta *:
val foo: Any = 1 : Int
Option(foo.asInstanceOf[String])
que falla por razones obvias:
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
A continuación, consideremos una clase siguiente:
case class DummyRow() {
val foo: Any = 1 : Int
def getAs[T] = foo.asInstanceOf[T]
def getAsOption[T] = Option(foo.asInstanceOf[T])
}
Por lo que yo puedo decirgetAs
debe comportarse de la misma manera que el anteriorapply
seguido porasInstanceOf
.
Sorprendentemente no es el caso. Cuando se llama solo, arroja una excepción:
DummyRow().getAs[String]
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
pero cuando se envuelve conOption
tiene éxito:
val stringOption = Option(DummyRow().getAs[String])
// Option[String] = Some(1)
DummyRow().getAsOption[String]
// Option[String] = Some(1)
y falla solo cuando intento acceder al valor envuelto:
stringOption.get
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
Entonces, ¿qué pasa aquí? Parece ser limitadoClassCastException
así que supongo que está relacionado con algo feo como el borrado de tipo.
* Any
yasInstanceOf
están ahí para imitar un comportamiento del código de terceros, así que no nos detengamos en eso.
** Probado en Scala 2.10.5, 2.11.7
*** Si estás interesado en el contexto, puedes echar un vistazo aUso de contiene en scala - excepción
**** Otras preguntas relevantes vinculadas en los comentarios:
¿Por qué a veces arroja `.asInstanceOf` y otras no?,¿Por qué asInstanceOf no arroja una ClassCastException?