Как я могу перебирать TreeMap и использовать отражение, чтобы получить имя подкласса?

Предположим, у меня есть следующий абстрактный класс и два подкласса:

public abstract class Contact {
    private String name;

    public void showDetails() {
        System.out.println(name);
    }
}

public class Personal extends Contact {
    private String relationship;

    // @override
    public void showDetails() {
        System.out.println(name);
        System.out.println(relationship);
    }
}

public class Business extends Contact {
    private String company;

    // @override
    public void showDetails() {
        System.out.println(name);
        System.out.println(company);
    }
}

Также предположим, что у меня есть TreeMap, содержащий целые числа в качестве ключей и объекты Business или Personal в качестве значений:

Map<Integer, Contact> masterList = new TreeMap<Integer, Contact>();

masterList.put(1, bContact1);
masterList.put(2, bContact2);
masterList.put(3, pContact1);
masterList.put(4, pContact2);

Можно ли выполнить итерацию по TreeMap И использовать отражение, чтобы увидеть, к какому подклассу принадлежит каждый объект, чтобы использовать правильный метод переопределения?

Например, ключ 1 связан с bContact1, который является бизнес-объектом. Я хочу использовать метод showDetails() из подкласса Business для этого конкретного значения.

Я могу нормально перебирать карту, но у меня проблемы с частью отражения. Любая помощь приветствуется!


person Monica    schedule 04.06.2014    source источник


Ответы (1)


Вам не нужно отражение, вам нужен полиморфизм. Просто вызовите метод для объекта, Java сделает все остальное, чтобы вызвать правильную реализацию.

Contact contactRef = masterList.get(2);
contactRef.showDetails(); // overriden method invoked if it exists, inherited otherwise
person Sotirios Delimanolis    schedule 04.06.2014
comment
Спасибо. У меня есть привычка все усложнять. Изменить: могу ли я сделать это, даже если контакт является абстрактным классом? - person Monica; 04.06.2014
comment
@NojoRu Да. Вы должны прочитать о наследовании и полиморфизме. Это одно из их свойств. - person Sotirios Delimanolis; 04.06.2014