Экземпляр универсального c параметра - PullRequest
0 голосов
/ 11 марта 2020

Я чувствую, что должен спросить это здесь, потому что не могу найти правильный ответ где-то еще. Я пытаюсь заставить работать следующий фрагмент кода, где componentList - это List<Component>. Я знаю некоторые обходные пути, такие как упомянутые в комментариях здесь . Но мне просто интересно, есть ли в java какое-то выражение для проверки instanceof обобщенного параметра c без его экземпляра. Я знаю, что мог бы также использовать class или какое-либо другое значение в качестве идентификатора для него.

public <T extends Component> T getComponent(){
        for (Component component:componentList) {
            if(component instanceof T){
                return component;
            }
        }
        return null;
    }

Уже спасибо за ваши ответы и проверку орфографии ^^

1 Ответ

4 голосов
/ 11 марта 2020

Из-за стирания типа T неизвестно во время выполнения, поэтому вы должны передать параметр, чтобы сообщить коду во время выполнения, что такое T.

public <T extends Component> T getComponent(Class<T> type) {
    for (Component component : componentList) {
        if (type.isInstance(component)) {
            return type.cast(component);
        }
    }
    return null;
}

Затем вызывающий должен укажите параметр следующим образом:

Subcomponent x = getComponent(Subcomponent.class);

К сожалению, нет никакого способа обойти это.

...