2015-09-26 46 views
1

任何人都可以解释为什么会发生?斯卡拉在通用函数中类型转换的怪异行为

scala> def as[T](v: Any) = Try(v.asInstanceOf[T]) 
as: [T](v: Any)scala.util.Try[T] 

scala> as[Int]("Hello") 
res0: scala.util.Try[Int] = Success(Hello) 

scala> res0.map(_ + 1) 
res1: scala.util.Try[Int] = Failure(java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer) 

这不是拳击,因为你可以用它代替Int自己的类型,它的工作方式。

似乎并不是名副其实的参数,因为您可以将Try替换为Option并且它会相同。

我猜这是关于擦除,但也许有人可以给一个详细的解释?

回答

4

这一切都在scaladoc

注意,在运行时铸造的成功模Scala的删除语义。因此表达式1.asInstanceOf[String]将在运行时抛出ClassCastException,而表达式List(1).asInstanceOf[List[String]]不会。在后面的例子中,因为type参数作为编译的一部分被擦除,所以不可能检查列表的内容是否是所请求的类型。

如此,因为T被删除,Try(v.asInstanceOf[T])不会马上抛出一个ClassCastException,因为就在JVM知道,你有一个Try[Any]。但只要您尝试处理包含的类型(如Int),就会触发异常。