0

class があるとしXます。コードのある時点でoof 型を取得し、Object明示的に にキャストしたいと考えていXます。通常、私はそうしますval x: X = o.asInstanceOf[X]。ただし、Xスコープ内にはありません。私が持っているのは、XのインスタンスだけですClass

  1. classOf[X]という引数として関数に渡しますclassOfX
  2. 私の機能内で、私はしたいと思いますval x: X = o.asInstanceOf[classOfX]

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

4

1 に答える 1

2

ほんのちょっと。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。何らかの形式のジェネリックを使用すると、キャストの問題が解消される可能性がありますが、コードを追加しないと判断できません。

于 2016-10-25T16:35:11.697 に答える