Подтвердить что ты не робот

Как определить, расширяет ли класс другой класс в Java?

В Java, как я могу определить, какие классы расширяет класс?

public class A{
}

public class B extends A{
}

public class C extends A{
}

public class D{
}

public class E extends B{
}

public class doSomething{

    public void myFunc(Class cls){
         //need to check that cls is a class which extends A
         //i.e. B, C and E but not A or D
    }
}

будет cls.getSuperClass() делать то, что мне нужно?

4b9b3361

Ответ 1

Подход getSuperClass() потерпит неудачу для E, так как его непосредственный суперкласс не A, а B. Скорее используйте Class#isAssignableFrom().

public void myFunc(Class cls){
     //need to check that cls is a class which extends A
     //i.e. B, C and E but not A or D

     if (cls != A.class && A.class.isAssignableFrom(cls)) {
         // ...
     }
}

Ответ 2

Вы должны попытаться избежать проверки типов и вместо этого реализовать функции в B, C и E, которые делают то, что вы хотите, иметь версии A и D ничего не делать, а затем вызывать эту функцию из вашего класса doSomething.

Если вы проверяете тип, это не очень удобно, потому что, когда вы добавляете новые классы, вам нужно изменить условную логику.

Эта проблема заключается в том, что классы и переопределение там предотвращаются.

Ответ 3

Да, Class.getSuperclass() - это именно то, что вам нужно.

Class<?> c = obj.getClass();
System.out.println(c.getSuperclass() == Some.class);

Ответ 4

Если вы хотите проверять время компиляции, вы можете использовать Generics (Java 5 и выше):

public void myFunc(Class<? extends A> cls) {
}

Передача в любом классе, не унаследованном от A, генерирует ошибку времени компиляции.