Сохранение объекта подкласса как суперкласса и получение подкласса позже - PullRequest
2 голосов
/ 03 февраля 2012

Допустим, у меня есть классы SubClass1 и SubClass2, которые расширяют SuperClass.Мне нужно хранить все объекты, расширяющие SuperClass, в списке (List list).Теперь я передаю список функции, которая может выяснить, какой подкласс был суперклассом ранее.Эта функция должна затем преобразовать суперкласс обратно в соответствующие подклассы.Например,

for (SuperClass superClass : list) {
    if (superClass.getType().equals("SubClass1")
        SubClass1 subClass = (SubClass1) superClass;
    else if (superClass.getType().equals("SubClass2")
        SubClass2 subClass = (SubClass2) superClass;
}

Этот пример приведет к исключению приведения класса.Есть ли простое решение для получения этой функциональности?

РЕДАКТИРОВАТЬ: Как упоминалось в одном из ответов, этот код должен вызвать исключение.Что-то должно быть не так с методом getType () в этом примере.Однако решение с использованием ключевого слова instanceof решает проблему, устраняя необходимость в методе getType ().

Ответы [ 3 ]

5 голосов
/ 03 февраля 2012

Используйте оператор instanceof .Вы можете преобразовать свой код в:

for (SuperClass superClass: list) {
    if (superClass instanceof SubClass1) {
        SubClass1 subClass = (SubClass1) superClass;
    }
    else if (superClass instanceof SubClass2) {
        SubClass2 subClass = (SubClass2) superClass;
    }
    else {
        // Something strange has happened, or superClass is null
    }
}
1 голос
/ 03 февраля 2012

Этот пример не выдает никаких исключений. Быстрый тест:

List<SuperClass> list = new ArrayList<SuperClass>();
    int count = 50;
    Random random = new Random();
    while(count-- > 0) {
        if(random.nextBoolean()) {
            list.add(new SubClass1());
        } else {
            list.add(new SubClass2());
        }
    }

    for (SuperClass superClass : list ) {
        if (superClass.getType().equals("SubClass1")){
            SubClass1 subClass = (SubClass1) superClass;
            System.out.println(subClass);
        }else if (superClass.getType().equals("SubClass2")){
            SubClass2 subClass = (SubClass2) superClass;
            System.out.println(subClass);
        }
    }

Если у вас есть исключение приведения класса, скорее всего, getType() реализация одного из классов возвращает неправильное значение, поэтому у вас есть исключение приведения класса. Или один из ваших подклассов не расширяет SuperClass.

1 голос
/ 03 февраля 2012

Да,

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

if(superClass instanceof SubClass1) {

  }

В случае, если superClass равно null, if возвращает false.

...