在Scala(v.2.11)中,以下表达式返回false
:
10.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
。
答案 0 :(得分:2)
Class.isInstance
需要Object
,因此参数自动生成并变为java.lang.Integer
(Scala无法执行任何其他操作,isInstance
由JVM)。
但10.getClass
由Scala编译器处理,因为JVM不允许在原语上调用方法。它返回基本类型int
(第二个println
显示),而Integer
不是int
。