`isInstanceOf`是如何工作的?

时间:2012-07-02 08:29:51

标签: scala subtype

假设,我们有:

class B
class A extends B
trait T

然后它成立:

val a: A with T = new A with T 
a.isInstanceOf[B]  // result is true !

是不是说isInstanceOf方法检查,如果在子类型关系中至少有一种类型(不是所有类型)与右侧匹配?

初看起来,我认为类型A with T的值不能是B的子类型,因为A T是不是B的两种子类型。但它是A TB的子类型 - 是吗?

2 个答案:

答案 0 :(得分:35)

isInstanceOf查看继承链中是否有相应的条目。 A with T链包含ABT,因此a.isInstanceOf[B]必须为真。

编辑:

实际上生成的字节代码调用javas instanceof,因此在java中它将是a instanceof B。像a.isInstanceOf[A with T]这样的一个更复杂的调用将是(a instanceof A) && (a instanceof T)

答案 1 :(得分:11)

  

初看起来,我认为带有T的类型A的值不能是a   B的亚型

这里有两个误解。首先,实例的静态类型与isInstanceOf的结果有任何关系:没有。需要明确的是,在a.isInstanceOf[B]执行时,a类型为A with T 的事实与无关。

方法isInstanceOf由JVM在字节码级别实现。它查看每个实例承载的类信息,并检查B其中一个类(实例本身及其祖先的类)或其中一个已实现的接口。这就是“is-a”关系:“a是B”。

从技术上讲,isInstanceOf是Java反思的一部分,它被称为instanceof

第二个误解是继承可以某种方式删除父类型。永远不会发生:继承只添加类型,永远不会删除它们。类型A with TABTAnyValAny。因此,即使isInstanceOf确实查看类型A with T,它仍然会返回true。