下面的函数是的一些代码我有一个特别令人讨厌的接口(如在无类型)的Java API的一部分。其目的是在上下文“知道”是什么类型应该是安全地进行类型转换,但我想确保我不会有一些未知的边缘情况不好的故障模式在运行时:斯卡拉编译器问题或JVM拳击subtlty?
def safeCast[A](o: Any): Option[A] =
Try(o.asInstanceOf[A]).toOption
现在看,当它在REPL会话的使用会发生什么:
scala> val testDouble: Double = 1.0
testDouble: Double = 1.0
scala> safeCast[Int](testDouble)
res0: Option[Int] = Some(1.0)
res0
号称有型Option[Int]
但价值Some(1.0)
(即 - Some[Double]
)。如果我们尝试映射此选项,则类别转换异常会出现。
这种行为只能用一个多态safeCast
发生。如果我们收紧特定类型:
def safeIntCast(o: Any): Option[Int] = Try(o.asInstanceOf[Int]).toOption
然后我们得到:
scala> safeIntCast(testDouble)
res1: Option[Int] = None
因此,多态性某种方式与拳击(我怀疑?)交互或编译器问题(错误? )。所使用的编译器版本为2.12.2
任何人都可以为此提供解释?