基于“Class”实例执行显式转换
Performing an explicit cast based on `Class` instance
假设有一个 class X
。在我的代码中的某个时刻,我得到一个类型为 Object
的 o
,我想将其显式转换为 X
。通常,我会做 val x: X = o.asInstanceOf[X]
。但是,X
不在范围内,我只有 X
的 Class
实例,如下所示:
- 我将
classOf[X]
作为一个名为 classOfX
的参数传递给我的函数。
- 在我的职能范围内,我想做
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
。使用某种形式的泛型很可能可以消除转换问题,但如果没有更多代码就无法判断。
假设有一个 class X
。在我的代码中的某个时刻,我得到一个类型为 Object
的 o
,我想将其显式转换为 X
。通常,我会做 val x: X = o.asInstanceOf[X]
。但是,X
不在范围内,我只有 X
的 Class
实例,如下所示:
- 我将
classOf[X]
作为一个名为classOfX
的参数传递给我的函数。 - 在我的职能范围内,我想做
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
。使用某种形式的泛型很可能可以消除转换问题,但如果没有更多代码就无法判断。