В 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<?>
is-a Collection<?>
, поэтому он пройдет первый тест, а else
означает, что он никогда не достигнет второго теста. Вы должны проверить от самого специфического к наиболее общему типу .