¿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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta