如何检查类类型B是否在groovy中扩展类类型A?
class A {
}
class B extends A {
}
答案 0 :(得分:12)
当右侧参数为类时,Groovy的in
运算符将测试是关系,因此B in A
等同于Java&#39 ; s 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
答案 1 :(得分:4)
您可以像在Java中一样进行:
A.isAssignableFrom(B)
请参阅另一个Justin Piper's answer了解Groovy in
运算符。
看起来很尴尬,但这意味着 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
答案 2 :(得分:2)
如果只是你所关心的直接继承,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)
}