@MaxLich
java developer

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

Здравствуйте. Иногда возникает необходимость проверить, является ли объект представителем некоторого дженерик-класса, параметризованным конкретным типов. Пока обычно не делаю такую проверку, проверяю только, что объект является представителем самого дженерик-класса. Но дженерик-класс же может быть параметризован в каждом конкретном случае каким-то своим типом. Если типы не будет совпадать, то я получу ошибку. Как проверить, что типы совпадают?
Пример кода:
public abstract class BaseComboBox<T> extends JComboBox<ComboboxItem<T>> {
//некоторый код
    @Override
    public ComboboxItem<T> getSelectedItem() {
        Object selectedItem = super.getSelectedItem();
        if (selectedItem == null)
            return null;
        else {
            if (selectedItem.getClass() == ComboboxItem.class) { // (1)
                return (ComboboxItem<T>) selectedItem; // (2)
            } else {
                return null;
            }
        }
    }
//некоторый код
}

public class ComboboxItem<T> {
    private String caption;
    private T value;

    public ComboboxItem(String caption, T value) {
        this.caption = caption;
        this.value = value;
    }

    @Override
    public String toString() {
        return caption;
    }

    public String getCaption() {
        return caption;
    }

    public T getValue() {
        return value;
    }
}

В данном примере в строчке (1) я просто проверяю, что совпадают классы, но не проверяю, что совпадает тип в угловых скобках. В (2) делаю кастинг, и здесь может быть ошибка, если типы разные. (Хотя в данном случае, типы всегда будут совпадать, в других местах подобный код может вызвать эксепшн)
  • Вопрос задан
  • 369 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Во-первых, обобщения - это инструкции только для компилятора. В байткоде их вообще нет и виртуальная машина о них ничего не знает. Во-вторых, ваш код нарушает принципы ООП. Как только вам понадобилась проверка типов в рантайме, знайте, что написали плохой код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Проблема в том, что generic в Java до 1.8 включительно существуют только на этапе компиляции.
Во время исполнения узнать generic тип легальным способом проблематично.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
19 апр. 2024, в 12:53
1000 руб./за проект
19 апр. 2024, в 12:41
8000 руб./за проект
19 апр. 2024, в 12:05
1500 руб./в час