首页 > 解决方案 > 检查 Collection 或 Map 是否为空或 null 的方法?

问题描述

我想检查 Map、HashMap、ArrayList、List 或 Collections 中的任何内容是 Empty 还是 null?

我有这个,但是当我通过地图时它不起作用:

protected static <T extends Collection, Map> boolean isCollectionMapNullOrEmpty(final T c) {
  if (c == null) {
      return true;
  }

  return c.isEmpty();
 }

失败:

  List<String> aList = Arrays.asList("a1", "a2", "a4");
  Map<String, Object> aMap = new HashMap<String, Object>();
  aMap.put("a2", "foo");
  aMap.put("a1", "foo");
  aMap.put("a3", "foo");
  aMap.put("a4", "foo");
  System.out.println(isCollectionMapNullOrEmpty(aList));  // works

  // fails with The method isCollectionMapNullOrEmpty(T) in the type LearnHashMap is not applicable for the arguments (Map<String,Object>)
  System.out.println(isCollectionMapNullOrEmpty(aMap));

标签: javadictionarygenericscollections

解决方案


您的isCollectionMapNullOrEmpty编译和工作,但不是您想要的方式。

<T extends Collection, Map>

您已经声明了两个类型变量,T并且Map, whereT必须是Collection. 类型变量Map与接口无关Map,实际上甚至没有使用。(此外,您在这里使用了原始Collection接口。)您传递aList的是 a Collection,因此它可以编译。但是,aMapis not a Collection,因此编译失败传入 a Map

看起来你想T成为 aCollection a Map。但是 Java 的泛型不是这样工作的。您不能将类型参数声明为一件事另一件事。

(顺便说一句,您可以说一件事另一件事:T extends Collection & Map,或者没有原始类型,T extends Collection<?> & Map<?, ?>但我不知道有任何类实现了这两个接口。)

您可以有两个重载方法,一个用于 a Collection,一个用于 a 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,这似乎是最好的。


推荐阅读