classOf[String].isInstance("42")
和"42".isInstanceOf[String]
之间是否存在差异?
如果是,你能解释一下吗?
答案 0 :(得分:8)
对于引用类型(扩展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
这是因为原始值类型在上传到Any
(或AnyVal
)时会被加框。对于JVM,它们显示为java.lang.Integer
s,而不是Int
s。 isInstanceOf
知道这一点并做正确的事。
一般来说,如果你知道classOf[T].isInstance(x)
是什么,就没有理由使用T
。如果您有一个泛型类型,并且想要“传递”一种方法来测试某个值是否属于该类(将通过isInstanceOf
测试),则可以使用scala.reflect.ClassTag
代替。 ClassTag
有点像Class
es,除了他们知道Scala拳击和其他一些事情。 (如果需要,我可以详细说明ClassTag
,但你应该在其他地方找到关于它们的信息。)