0

假设有一个类X。在我的代码中的某个时刻,我得到了一个o类型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方法可以让您将 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。使用某种形式的泛型可能会消除强制转换问题,但如果没有更多代码则无法判断。

于 2016-10-25T16:35:11.697 回答