Как проверить, расширяет ли тип класса A тип класса B в groovy

Как проверить, расширяет ли тип класса B тип класса A в groovy?

class A {
}

class B extends A {
}

3 ответов


в Groovy in оператор проверит для это отношение, когда аргумент правой руки является классом, поэтому B 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)

посмотреть другое ответ Джастина Пайпера для 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

посмотреть класса.isAssignableFrom.


Если вас интересует только прямое наследование, java.ленг.Класс'getSuperclass метод должен сделать трюк:

assert B.superclass == A

применяя немного Groovy magic к ответу @Grzegorz, вы можете сделать это, чтобы добавить более читаемый метод к типу класса:

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