`isInstanceOf`是如何工作的?

Joh*_*ood 25 scala subtype

假设,我们有:

class B
class A extends B
trait T
Run Code Online (Sandbox Code Playgroud)

然后它成立:

val a: A with T = new A with T 
a.isInstanceOf[B]  // result is true !
Run Code Online (Sandbox Code Playgroud)

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

在第一次看,我认为有类型的值A with T不可能是一个亚型B,因为A T没有的两种亚型B.但它是A 或是 T一个子类型B- 是吗?

dre*_*xin 36

isInstanceOf查看继承链中是否有相应的条目.链A with T包括A,BT,所以a.isInstanceOf[B]必须是真实的.

编辑:

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


Dan*_*ral 12

初看起来,我认为类型A和T的值不能是B的子类型

这里有两个误解.首先,实例的静态类型与结果有关isInstanceOf:没有.要明确的是,在做a.isInstanceOf[B]的时候,a类型的事实A with T 是不相关的.

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

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

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