isInstance和isInstanceOf之间的区别

7
classOf[String].isInstance("42")"42".isInstanceOf[String]有区别吗?如果有,你能解释一下吗?
1个回答

13

对于扩展 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来说,它们不再以Int的形式出现,而是以java.lang.Integer的形式出现。 isInstanceOf知道这一点,并会做正确的事情。
一般来说,如果您知道T是什么,就没有理由使用classOf[T].isInstance(x)。如果您有一个通用类型,并且想要“传递”一种测试一个值是否属于该类的方法(将通过isInstanceOf测试),则可以使用scala.reflect.ClassTagClassTag有点像Class,除了它们知道Scala装箱和其他一些东西。(如果需要,我可以详细说明ClassTag,但您应该在其他地方找到有关它们的信息。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接