6 ответов:
обновление: здесь возможны два сценария:
вы определяете, является ли объект коллекцией;
вы определяете, является ли класс коллекцией.
решения немного отличаются, но принцип тот же. Вам также нужно определить, что именно представляет собой "коллекция". Реализация либо
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