如何检查类类型B是否在groovy中扩展类类型A?
class A {
}
class B extends A {
}
当右手参数是类时,Groovy 的in
运算符将测试isB in A
关系,因此相当于 Java 的A.isAssignableFrom(B)
. 这也适用于对象。new C() in A
相当于new C() instanceof A
。
class A {}
class B extends A {}
class C extends B {}
assert C in A // C inherits from A
interface I {}
interface J extends I{}
assert J in I // J extends I
class D implements I {}
assert D in I // D implements I
final o = new C()
assert o in A // o is an instance of A
您可以像在 Java 中那样做:
A.isAssignableFrom(B)
请参阅另一个Justin Piper对 Groovyin
运算符的回答。
看起来很尴尬,但这意味着B 是 A 的子类。继承层次的高度无关紧要。它也适用于接口。
class A {}
class B extends A {}
class C extends B {}
assert A.isAssignableFrom(C) // C inherits from A
interface I {}
interface J extends I{}
assert I.isAssignableFrom(J) // J extends I
class D implements I {}
assert I.isAssignableFrom(D) // D implements I
如果它只是您关心的直接继承,java.lang.Class'getSuperclass
方法应该可以解决问题:
assert B.superclass == A
对@Grzegorz 的回答应用一点 Groovy 魔法,您可以这样做以向 Class 类型添加更具可读性的方法:
class ClassHelper {
static boolean extendsFrom(Class sub, cls) {
cls.isAssignableFrom(sub)
}
}
class A {
}
class B extends A {
}
class C extends B {
}
use(ClassHelper) {
assert B.extendsFrom(A)
assert C.extendsFrom(B)
assert C.extendsFrom(A)
assert !B.extendsFrom(C)
}