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?