基于“Class”实例执行显式转换

Performing an explicit cast based on `Class` instance

假设有一个 class X。在我的代码中的某个时刻,我得到一个类型为 Objecto,我想将其显式转换为 X。通常,我会做 val x: X = o.asInstanceOf[X]。但是,X 不在范围内,我只有 XClass 实例,如下所示:

  1. 我将 classOf[X] 作为一个名为 classOfX 的参数传递给我的函数。
  2. 在我的职能范围内,我想做 val x: X = o.asInstanceOf[classOfX]

有没有办法在 Scala 中做到这一点?

只是种。 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

这将 "work" 用于大多数 类,但不适用于 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 获得的 类 一起使用,如上。

缺点是您应该不惜一切代价避免强制转换,因为它很容易使代码出错。它将类型安全抛出 window。很少有人会发现自己有一个不知道它是什么的对象,但可以通过某种方式告诉编译器它正在使用什么 classOf。使用某种形式的泛型很可能可以消除转换问题,但如果没有更多代码就无法判断。