Используя java-отражение, мы можем легко узнать, является ли объект массивом. Самый простой способ определить, является ли объект коллекцией (Set, List, Map, Vector...)?
Как проверить, является ли объект типом коллекции в Java?
Ответ 1
if (x instanceof Collection<?>){
}
if (x instanceof Map<?,?>){
}
Ответ 2
Обновление: есть два возможных сценария:
-
Вы определяете, является ли объект коллекцией,
-
Вы определяете, является ли класс коллекцией.
Решения немного отличаются, но принципы одинаковы. Вам также необходимо определить, что именно представляет собой "коллекцию". Реализация Collection
или Map
будет охватывать сборники Java.
Решение 1:
public static boolean isCollection(Object ob) {
return ob instanceof Collection || ob instanceof Map;
}
Решение 2:
public static boolean isClassCollection(Class c) {
return Collection.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c);
}
(1) также может быть реализовано в терминах (2):
public static boolean isCollection(Object ob) {
return ob != null && isClassCollection(ob.getClass());
}
Я не думаю, что эффективность любого метода будет сильно отличаться от эффективности.
Ответ 3
Поскольку вы упомянули отражение в своем вопросе,
boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());
Ответ 4
Java удобно имеет оператор instanceof
(JLS 15.20.2), чтобы проверить, является ли данный объект заданным типом.
if (x instanceof List<?>) {
List<?> list = (List<?>) x;
// do something with list
} else if (x instanceof Collection<?>) {
Collection<?> col = (Collection<?>) x;
// do something with col
}
Здесь следует упомянуть одну вещь: важно в этих конструкциях проверить правильный порядок. Вы обнаружите, что если бы вы поменяли порядок проверки в приведенном выше фрагменте, код все равно будет компилироваться, но он больше не будет работать. То есть следующий код не работает:
// DOESN'T WORK! Wrong order!
if (x instanceof Collection<?>) {
Collection<?> col = (Collection<?>) x;
// do something with col
} else if (x instanceof List<?>) { // this will never be reached!
List<?> list = (List<?>) x;
// do something with list
}
Проблема в том, что a List<?>
is-a Collection<?>
, поэтому он пройдет первый тест, а else
означает, что он никогда не достигнет второго теста. Вам нужно протестировать наиболее специфичный для наиболее общего типа.
Ответ 5
Проверьте, реализует ли объект либо java.util.Collection
, либо java.util.Map
. (Map
нужно тестировать отдельно, потому что это не суб-интерфейс Collection
.)
Ответ 6
Считаете ли вы, что используете instanceof
?
Например, скажем
if(myObject instanceof Collection) {
Collection myCollection = (Collection) myObject;
Хотя это не тот чистый стиль ООП, он в основном используется для так называемой "эскалации типа".