isInstance和isInstanceOf之间的区别

时间:2014-10-02 20:02:35

标签: scala

classOf[String].isInstance("42")"42".isInstanceOf[String]之间是否存在差异?

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

1 个答案:

答案 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,但你应该在其他地方找到关于它们的信息。)