以下の関数は、(型指定されていない)Java APIと特に厄介なものとインタフェースしなければならないコードの一部です。安全にコンテキストがタイプはどうあるべきかを「知っている」のキャストを実行するためのものが、私は、実行時にいくつかの未知のエッジケースに悪い故障モードを持っていませんを確認するにされていますScalaコンパイラの問題またはJVMのボクシングのサブミティ?
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でした
誰でも説明ができますか?