6

如何检查类类型B是否在groovy中扩展类类型A?

class A {
}

class B extends A {
}
4

3 回答 3

14

当右手参数是类时,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
于 2013-09-27T20:18:07.777 回答
4

您可以像在 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
    

请参阅Class.isAssignableFrom

于 2013-09-27T14:27:07.433 回答
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)
}
于 2013-09-27T14:23:41.740 回答