isInstance和isInstanceOf之间的区别

Yan*_*san 5 scala

有没有之间的差异classOf[String].isInstance("42")"42".isInstanceOf[String]

如果是的话,你能解释一下吗?

sjr*_*jrd 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
Run Code Online (Sandbox Code Playgroud)

这是因为原始值类型在被上传到Any(或AnyVal)时被加框.对于JVM,它们显示为java.lang.Integers,而不再是Ints.在isInstanceOf知道这一点,并会做正确的事.

一般来说,没有理由使用,classOf[T].isInstance(x)如果你知道那是什么T.如果你有一个泛型类型,并且你想"传递"一种方法来测试一个值是否属于那个类(将通过isInstanceOf测试),你可以使用一个scala.reflect.ClassTag.ClassTags有点像Classes,除了他们知道Scala拳击和其他一些东西.(ClassTag如果需要,我可以详细说明,但你应该在其他地方找到关于它们的信息.)