在Scala中:“10.getClass.isInstance(10)”是错误的

时间:2016-07-09 19:34:26

标签: scala

在Scala(v.2.11)中,以下表达式返回false10.getClass.isInstance(10)

根据我对getClass的理解,10.getClass应该是10是实例的类,因此表达式应该返回true

解释这个结果的语义是什么?或者它是Scala中的错误?

这是一个完整的可执行示例,以及一些相关的表达式。

object Tmp {
  def main(args:Array[String]) : Unit = {
    println(10.getClass.isInstance(10)) // false

    println(10.getClass) // int
    println(10.isInstanceOf[Int]) // true
    println(classOf[Int].isInstance(10)) // false
    println(classOf[Integer].isInstance(10)) // true
    println(classOf[Int].isInstance(10.asInstanceOf[Int])) // false
    // println(classOf[Int].isInstance(new Int(10))) // does not compile: Int is an abstract class
  }
}

修改 正如我从答案中理解的那样,对于引用类型的x,x.getClass.isInstance(x)将是真的,但对于值类型的x则不是。因此,在依赖x.getClass.isInstance(x)的通用代码(例如,类型检查通用集合)中,应使用类型参数x:T键入T <: AnyRef

1 个答案:

答案 0 :(得分:2)

Class.isInstance需要Object,因此参数自动生成并变为java.lang.Integer(Scala无法执行任何其他操作,isInstance由JVM)。

10.getClass由Scala编译器处理,因为JVM不允许在原语上调用方法。它返回基本类型int(第二个println显示),而Integer不是int