Проверьте, является ли какой-либо объект экземпляром какого-либо класса в списке - PullRequest
2 голосов
/ 23 июня 2019

Итак, я хочу получить список типов, затем перебрать список и проверить, является ли объект экземпляром типа в этом списке.

Вот как я могу представить, что он работает, ноэто не синтаксис Java.Type1.class также не работает

List<Object> types = new ArrayList();
types.add(Type1);
types.add(Type2);

for (Object type : types) {
    if (someObject instanceof type) {
        doSomething();
    }
}

или то же самое с List<Class> или что-то в этом роде

это явно не работает, но я не знаю, как лучшесделать это.Конечно, я мог бы просто жестко закодировать каждый объект, который я хочу проверить, но это не выглядит так элегантно.

Ответы [ 2 ]

5 голосов
/ 23 июня 2019

Из документации по Java:

В Java экземпляры класса Class представляют классы и интерфейсы в работающем приложении Java.

Вы можете использовать метод Class::isInstance, чтобы определить, является ли объект экземпляром данного типа, а затем применить обработку на основе этой оценки:

List<Class<?>> types = new ArrayList<>();
types.add(String.class);
types.add(Integer.class);

String someObject = "someString";

for (Class<?> type : types) {
    if (type.isInstance(someObject)) {
         // do smoething
    }
}
1 голос
/ 23 июня 2019

Эти требования требуют использования отражения . В Java есть класс, предназначенный для представления типа объекта: класс класс . Экземпляры этого класса эффективно представляют типы объектов. Так что вы могли бы сделать:

List<Class<?>> types = new ArrayList<>();
types.add(Type1.class);
types.add(Type2.class);

for (Class<?> type : types) {
    if (type.isAssignableFrom(someObject.getClass())) {
        doSomething();
    }
}

Обратите внимание, что в этой ситуации важно знать, хотите ли вы проверить, имеет ли целевой объект того же типа , что и тип в списке, или можно присвоить тип в списке. Пример кода охватывает второй вариант, потому что он ближе к первоначальному замыслу. Если вам нужно точное совпадение, вы должны сделать:

object.getClass() == type;

См. Также Class.isInstance против Class.isAssignableFrom

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...