classOf[String].isInstance("42")
和"42".isInstanceOf[String]
之间有区别吗?isInstance和isInstance之间的区别
如果是,你能解释一下吗?
classOf[String].isInstance("42")
和"42".isInstanceOf[String]
之间有区别吗?isInstance和isInstance之间的区别
如果是,你能解释一下吗?
对于参考类型(扩展为AnyRef
的那些),最终结果没有差异。然而,我们非常鼓励isInstanceOf
,因为它比较习惯(可能效率更高)。
对于原始值的类型,如数字和布尔值,是有区别的:
scala> val x: Any = 5
x: Any = 5
scala> x.isInstanceOf[Int]
res0: Boolean = true
scala> classOf[Int].isInstance(x)
res1: Boolean = false
这是因为当upcasted到Any
(或AnyVal
)原始值类型被装箱。对于JVM,它们显示为java.lang.Integer
s,而不是Int
s。 isInstanceOf
知道这一点,并会做正确的事情。
一般来说,没有理由使用classOf[T].isInstance(x)
如果你知道那么T
是什么。如果你有一个泛型类型,并且你想“传递”一种方法来测试一个值是否属于那个类(通过isInstanceOf
测试),你可以改用scala.reflect.ClassTag
。 ClassTag
s有点像Class
es,除了他们知道斯卡拉拳击和其他一些事情。 (如果需要,我可以详细说明ClassTag
,但您应该在其他地方找到有关它们的信息。)