Ваш isCollectionMapNullOrEmpty
компилируется и работает, но не так, как вы хотели.
<T extends Collection, Map>
Вы объявили две переменные типа, T
и Map
, где T
должно бытьCollection
.Переменная типа Map
не имеет ничего общего с интерфейсом Map
и фактически даже не используется.(Кроме того, вы использовали здесь интерфейс Collection
.) Вы передаете aList
, который является Collection
, поэтому он компилируется.Однако aMap
не является Collection
, поэтому компиляция не может передать Map
.
Похоже, вы хотели, чтобы T
был либо Collection
, либо a Map
.Но дженерики Java не работают таким образом;Вы не можете объявить параметр типа как одну вещь или другую вещь.
(Кроме того, вы можете сказать одну вещь и другую вещь: T extends Collection & Map
или без необработанных типов, T extends Collection<?> & Map<?, ?>
, но я не знаю ни одного класса, реализующего оба интерфейса.)
Вы можете иметь два перегруженных метода, один для Collection
и один для Map
, который будет выполнять те же функции.Здесь я воспользовался коротким замыканием, чтобы объединить операторы:
protected static boolean isCollectionMapNullOrEmpty(final Collection<?> c) {
return c == null || c.isEmpty();
}
protected static boolean isCollectionMapNullOrEmpty(final Map<?, ?> m) {
return m == null || m.isEmpty();
}
Оба метода имеют один и тот же точный код, но поскольку нет суперинтерфейса, объявляющего isEmpty
, похоже, чтотак хорошо, как только может.