のみの種類です。 java.lang.Class
にはcast
というメソッドがあり、Class[A]
をA
にキャストできます。 Scalaの箱入りのプリミティブのため
def cast[A](o: Any, clazz: Class[A]): A = clazz.cast(o)
scala> cast("abc", classOf[String])
res10: String = abc
ほとんどのクラスのためのこの意志「仕事」ではなく:あなたはこのようなメソッドを書くことができ
scala> cast(1, classOf[Int])
java.lang.ClassCastException: Cannot cast java.lang.Integer to int
そしてもちろんの
は、キャストだけモジュロ型消去を動作しますので、これはすぐに例外をスローしません。逆に
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
。何らかの形式のジェネリックを使用するとキャストの問題が解消される可能性がありますが、それ以上のコードを書くことは不可能です。
可能な複製http://stackoverflow.com/questions/40220804/scala-cast-to-a-variable-type – pamu
重複していません。あなたがリンクした投稿の機能は一般的なものであり、私のものはそうではありません。上で述べたように、ジェネリック型引数 'X'はありませんが、' class'型の引数は 'classOfX'です。 – lambdarookie