В настоящее время я создаю игру в java (пошаговая RPG) и сталкиваюсь с проблемой в пользовательском интерфейсе инвентаризации. Возможно, моя проблема хорошо известна или имеет простое решение, но никогда не было никакой подготовки, я все равно задаю вопрос.проверка типа ссылки в generics java
При отображении инвентаря после выбора элемента я проверяю, реализует ли этот элемент интерфейс SpecificItemWorker
, то есть действует на конкретный GameObject
, который должен быть передан его методу takeAction()
. Выбирая тот объект, который должен быть передан, я показываю все возможные объекты-кандидаты для выбора пользователем. Например, предположим, что пользователь выбирает UpgradeParchment
, который действует на любой объект, реализующий интерфейс Upgradable
. Здесь я инициирую ItemSelector
, который отображает все элементы в инвентаре, который реализует Upgradable
. Однако с другим классом интерфейс, который объект должен реализовать для того, чтобы быть потенциальным кандидатом, будет отличаться. (Обратите внимание, что некоторые объекты воздействуют на игровую среду, а не на определенный объект, но мы не рассматриваем этот случай здесь.). Теперь вместо жесткого кодирования возможных интерфейсов в операторе switch case
я хочу, чтобы он был dynamic.I пытался использовать generics, но он не позволяет проверить, является ли объект instanceof
параметра Type. Следующий код дает ошибку компиляции:
package ui;
import objects.Collectable;
public class ItemSelector<T> {
public void test(Collectable ob) {
if (ob instanceof T) {// compile error
// do work
}
}
}
Кто-нибудь знает, как это может быть достигнуто Спасибо за любую помощь.
Ищет быстрый ответ, Спасибо.
EDIT: Параметр в методе testAction()
будет типа Collectable
как в моем классе инвентаризации, есть только список Collectable
objects.Similarly, в моем методе испытаний, я обновил types.Although его это незначительные изменения, извините за любые неудобства. Collectable
также является интерфейсом.
Метод 'class.getTypeName()' возвращает информацию о типе класса. Но он не может использоваться для передачи теста отношения IS-A. Кроме того, 'SpecificItemWorker' является интерфейсом.Он используется для определения того, должен ли объект, который пользователь выбирает использовать, требует другого объекта «Collectable» для работы. –
Это неверно на нескольких уровнях, но особенно с помощью '==' для сравнения строк, которые никогда не будут истинными – Bohemian