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

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

Похожие вопросы