ほんのちょっと。java.lang.Class
を にcast
キャストできるメソッドがありClass[A]
ますA
。次のようなメソッドを書くことができます:
def cast[A](o: Any, clazz: Class[A]): A = clazz.cast(o)
scala> cast("abc", classOf[String])
res10: String = abc
これはほとんどのクラスで「機能」しますが、Scala ボックス化されたプリミティブでは機能しません。
scala> cast(1, classOf[Int])
java.lang.ClassCastException: Cannot cast java.lang.Integer to int
そしてもちろん、キャストは modulo 型の消去のみで機能するため、すぐに例外がスローされることはありません。
scala> val a = List("a").getClass
a: Class[_ <: List[String]] = class scala.collection.immutable.$colon$colon
scala> cast(List(1), a)
res16: List[String] = List(1)
利点として、上記のように、実行時に を使用して取得したクラスでも機能しますgetClass
。
欠点は、コードがエラーになりやすいため、キャストを絶対に避ける必要があることです。タイプセーフを窓の外に投げ出します。オブジェクトが何であるかわからないが、それが何を使用しているかをコンパイラに伝えることができるという状況に陥ることはめったにありませんclassOf
。何らかの形式のジェネリックを使用すると、キャストの問題が解消される可能性がありますが、コードを追加しないと判断できません。