2016-10-25 6 views
0

クラスXがあるとします。私のコードのある時点で、Objectというタイプのoが得られます。それを明示的にXにキャストしたいと思います。通常、私はval x: X = o.asInstanceOf[X]をやります。私はclassOfXと呼ばれる引数としての私の関数にclassOf[X]を渡す`Class`インスタンスに基づく明示的キャストの実行

  1. :しかし、Xはスコープではありませんが、私が持っているすべてはそうのように、ClassXのインスタンスです。
  2. 私の機能の範囲内では、val x: X = o.asInstanceOf[classOfX]としたいと思います。

Scalaでこれを行う方法はありますか?

+1

可能な複製http://stackoverflow.com/questions/40220804/scala-cast-to-a-variable-type – pamu

+0

重複していません。あなたがリンクした投稿の機能は一般的なものであり、私のものはそうではありません。上で述べたように、ジェネリック型引数 'X'はありませんが、' class'型の引数は 'classOfX'です。 – lambdarookie

答えて

2

のみの種類です。 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。何らかの形式のジェネリックを使用するとキャストの問題が解消される可能性がありますが、それ以上のコードを書くことは不可能です。

関連する問題