假设我有一个这样的数组*:
val foo: Any = 1 : Int
Option(foo.asInstanceOf[String])
由于明显的原因而失败:
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
接下来让我们考虑以下类:
case class DummyRow() {
val foo: Any = 1 : Int
def getAs[T] = foo.asInstanceOf[T]
def getAsOption[T] = Option(foo.asInstanceOf[T])
}
据我所知getAs
,应该与前面的行为相同,apply
后面跟着asInstanceOf
.
令人惊讶的是,事实并非如此。单独调用时会抛出异常:
DummyRow().getAs[String]
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
但是当包装Option
成功时:
val stringOption = Option(DummyRow().getAs[String])
// Option[String] = Some(1)
DummyRow().getAsOption[String]
// Option[String] = Some(1)
并且仅在我尝试访问包装值时失败:
stringOption.get
// java.lang.ClassCastException: java.lang.Integer cannot be cast to
// java.lang.String
// ... 48 elided
那么这里会发生什么?它似乎是有限的ClassCastException
,所以我想这与一些丑陋的事情有关,比如类型擦除。
*Any
并asInstanceOf
在那里模仿第 3 方代码的行为,所以请不要纠缠于此。
** 在 Scala 2.10.5、2.11.7 中测试
*** 如果您对上下文感兴趣,可以查看Using contains in scala - exception
****评论中链接的其他相关问题: