Как проверить, является ли объект типом коллекции в Java?



используя отражение java, мы можем легко узнать, является ли объект массивом. Какой самый простой способ сказать, является ли объект коллекцией (набор,список,карта,вектор...)?

464   6  

6 ответов:

if (x instanceof Collection<?>){
}

if (x instanceof Map<?,?>){
}

обновление: здесь возможны два сценария:

  1. вы определяете, является ли объект коллекцией;

  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());
}

Я не думаю, что эффективность любого метода будет значительно отличаться от других.

поскольку вы упомянули отражение в вашем вопросе;

boolean isArray = myArray.getClass().isArray();
boolean isCollection = Collection.class.isAssignableFrom(myList.getClass());
boolean isMap = Map.class.isAssignableFrom(myMap.getClass());

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
 }

проблема в том, что List<?>-это Collection<?>, так что он пройдет первый тест, и else означает, что он никогда не достигнет второго теста. вы должны проверить от самого конкретного до самого общего типа.

проверить, если объект реализует либо java.util.Collection или java.util.Map. (Map должен быть протестирован отдельно, потому что это не суб-интерфейс Collection.)

вы думали об использовании instanceof ? Мол, скажи

if(myObject instanceof Collection) {
     Collection myCollection = (Collection) myObject;

хотя это не чистый стиль ООП, он, однако, в значительной степени используется для так называемой "эскалации типа".

Comments

    Ничего не найдено.