Warum verzögert das Umschließen eines generischen Methodenaufrufs mit Option die ClassCastException?

Sagen wir, ich habe ein Array wie dieses *:

val foo: Any = 1 : Int
Option(foo.asInstanceOf[String])

was aus offensichtlichen Gründen fehlschlägt:

// java.lang.ClassCastException: java.lang.Integer cannot be cast to 
// java.lang.String
// ... 48 elided

ei @Next wird folgende Klasse betrachtet:

case class DummyRow() {
  val foo: Any = 1 : Int
  def getAs[T] = foo.asInstanceOf[T]
  def getAsOption[T] = Option(foo.asInstanceOf[T])
}

Soweit ich sagen kanngetAs sollte sich genauso verhalten wie das vorherigeapply gefolgt vonasInstanceOf.

Überraschenderweise ist das nicht der Fall. Wenn es alleine aufgerufen wird, löst es eine Ausnahme aus:

DummyRow().getAs[String]
// java.lang.ClassCastException: java.lang.Integer cannot be cast to 
// java.lang.String
// ... 48 elided

aber wenn mit @ umwickeOption gelingt es

val stringOption = Option(DummyRow().getAs[String])
// Option[String] = Some(1)

DummyRow().getAsOption[String]
// Option[String] = Some(1)

und schlägt nur fehl, wenn ich versuche, auf den umbrochenen Wert zuzugreifen:

stringOption.get
// java.lang.ClassCastException: java.lang.Integer cannot be cast to 
// java.lang.String
// ... 48 elided

Also was passiert hier? Es scheint begrenzt zu seinClassCastException Also, ich denke, es hängt mit einer hässlichen Sache zusammen, wie dem Löschen von Buchstaben.

* Any undasInstanceOf sind da, um ein Verhalten des Drittanbieter-Codes nachzuahmen, also lasst uns bitte nicht weiter darauf eingehen.

** Getestet in Scala 2.10.5, 2.11.7

*** Wenn Sie sich für den Kontext interessieren, können Sie sich @ anseheUsing enthält in Scala - Ausnahme

**** Andere relevante Fragen, die in den Kommentaren verlinkt sind:

Warum wirft `.asInstanceOf` manchmal und manchmal nicht?,Warum löst asInstanceOf keine ClassCastException aus?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage