Как узнать подкласс из экземпляра базового класса? - PullRequest
15 голосов
/ 18 мая 2010

Есть ли способ узнать имя производного класса из экземпляра базового класса?

например:.

class A{
    ....
}
class B extends A{
    ...
}
class c extends A{
    ...
}

теперь, если метод возвращает объект A, могу ли я узнать, имеет ли он тип B или C?

Ответы [ 6 ]

19 голосов
/ 18 мая 2010

с использованием instanceof или Class#getClass()

A returned = getA();

if (returned instanceof B) { .. }
else if (returned instanceof C) { .. }

getClass() вернет либо: A.class, B.class, C.class

Внутри предложения if вам нужно уменьшить значение, т. Е.

((B) returned).doSomethingSpecificToB();

Тем не менее, иногда считается, что использование instanceof или getClass() является плохой практикой. Вы должны использовать полиморфизм , чтобы избежать необходимости проверять конкретный подкласс, но я не могу рассказать вам больше с предоставленной информацией.

5 голосов
/ 18 мая 2010

Вы пробовали использовать instanceof

например.

Class A aDerived= something.getSomethingDerivedFromClassA();

if (aDerived instanceof B) {

} else if (aDerived instanceof C) {

}

//Use type-casting where necessary in the if-then statement.
3 голосов
/ 18 мая 2010

Краткий ответ на ваш вопрос

Есть ли способ узнать имя производного класса из объекта базового класса?

нет , суперкласс не может сказать имя / тип подкласса.

Вы должны опросить объект (который является экземпляром подкласса) и спросить, является ли он: instanceof конкретным подклассом, или вызвать его getClass() метод.

2 голосов
/ 05 марта 2018

Есть ли способ узнать имя производного класса из экземпляра базового класса?

Как ответили здесь , вы можете использовать этот чрезвычайно простой подход.

abstract class A {
    public final String getName() {
         return this.getClass().getName();
    }
}

class B extends A { }

class C extends A { }

затем просто напечатайте текущее class имя:

B b = new B();
C c = new C();

System.out.println(b.getName());
System.out.println(c.getName());

Выход:

com.test.B
com.test.C

Нет необходимости хранить дополнительные Strings, отметьте instanceof или override метод в любом подклассе.

0 голосов
/ 09 января 2016

Вы можете сделать это в конструкторе подкласса

class A {
    protected String classname;
    public A() { this.classname = "A"; }
    public String getClassname() { return this.classname; }
}
class B extends A {
    public B() {
        super();
        this.classname = "B";
    }
}

Итак

A a = new A();
a.getClassname(); // returns "A"
B b = new B();
b.getClassname(); // returns "B"
((A)b).getClassname(); // Also returns "B"

Поскольку он преобразуется в объект «A», он вызывает функцию «A» getClassname(), но возвращает значение, установленное конструктором, который был конструктором «B».

Примечание. Позвоните super(); перед настройкой

0 голосов
/ 18 мая 2010

Есть два способа, которыми я могу придумать: 1) Один с использованием API отражения Java 2) Другой - с instanceOf

Другой метод может быть Сравнение объектов с объектами, я не знаю, как этоможет быть, вы можете попробовать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...