假设,我们有:
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
,B
和T
,所以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.