classOf[String].isInstance("42")
和"42".isInstanceOf[String]
有区别吗?如果有,你能解释一下吗?classOf[String].isInstance("42")
和"42".isInstanceOf[String]
有区别吗?如果有,你能解释一下吗?对于扩展 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.ClassTag
。 ClassTag
有点像Class
,除了它们知道Scala装箱和其他一些东西。(如果需要,我可以详细说明ClassTag
,但您应该在其他地方找到有关它们的信息。)