Как проверить, расширяет ли тип класса 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)
}