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

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

Войти через TM ID
Похожие вопросы
BostonGene Москва
от 100 000 до 200 000 руб.
Payneteasy Москва
от 120 000 руб.
МойСклад Москва
от 120 000 до 160 000 руб.