假设有一个类X
。在我的代码中的某个时刻,我得到了一个o
类型Object
,我想将它显式地转换为X
. 通常,我会这样做val x: X = o.asInstanceOf[X]
。但是,X
不在范围内,我所拥有的只是X
的实例Class
,如下所示:
- 我将作为参数传递
classOf[X]
给我的函数,称为classOfX
. - 在我的职能范围内,我想做
val x: X = o.asInstanceOf[classOfX]
.
有没有办法在 Scala 中做到这一点?
假设有一个类X
。在我的代码中的某个时刻,我得到了一个o
类型Object
,我想将它显式地转换为X
. 通常,我会这样做val x: X = o.asInstanceOf[X]
。但是,X
不在范围内,我所拥有的只是X
的实例Class
,如下所示:
classOf[X]
给我的函数,称为classOfX
.val x: X = o.asInstanceOf[classOfX]
.有没有办法在 Scala 中做到这一点?
只有一种。java.lang.Class
有一种cast
方法可以让您将 aClass[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
当然,强制转换仅适用于模类型擦除,所以这不会立即抛出异常:
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
。使用某种形式的泛型可能会消除强制转换问题,但如果没有更多代码则无法判断。