2014-10-02 29 views

回答

7

对于参考类型(扩展为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 

这是因为当upcasted到Any(或AnyVal)原始值类型被装箱。对于JVM,它们显示为java.lang.Integer s,而不是Int s。 isInstanceOf知道这一点,并会做正确的事情。

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