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

时间:2013-09-27 13:46:24

标签: groovy

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

class A {
}

class B extends A {
}

3 个答案:

答案 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

请参阅Class.isAssignableFrom

答案 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)
}