当前位置: 首页 > 面试题库 >

检查Java集合通用类型是否为空集合

汤英豪
2023-03-14
问题内容

我要实现以下功能:

public boolean checkType(Vector<?> vec)
{
  // return true if its Vector<Integer> and false otherwise
}

如何检查向量元素类型? 请注意, 向量可能为空,因此我无法检查第一个元素是“ instanceof”整数还是String …

编辑:

好吧,我脑子里有个念头,我不知道它是否会起作用

我可以按以下方式实现checkType函数:

public <T> boolean checkType(Vector<T> vec)
{
  // return true if T is Integer and false otherwise
}

是否可以检查T是否为整数?!

提前致谢


问题答案:

*由于
类型擦除,


*泛型类型参数

在运行时不可恢复(某些特殊情况除外)。这意味着在运行时,Vector<Integer>Vector<String>都只是Vectors,而它们的元素也只是Object引用。

只有instanceof单个元素的实际运行时类(可以通过检查发现)才能确定元素类型,否则Vector本身不知道其元素类型是什么。

因此,基本上,任何类型的空向量都等于任何其他类型的 向量。像这样强制转换甚至是安全的:

Vector<String> noStrings = (Vector<String>) new Vector<Integers>();

但是,存在一个问题,因为尽管您可以说 向量符合任何必需的元素类型,但是 只要向量保持为空 ,该语句就成立。因为如果您这样做:

Vector<Integer> ints = new Vector<Integer>(); // empty
Vector<String> strings = (Vector<String>) ints; // unchecked warning, but still possibly ok
ints.add(1); // here comes trouble
String s = strings.get(1); // oh oh, ClassCastException

编辑:

回答您的第二个问题:不,不可能这样写:

public <T> boolean checkType(Vector<T> vec) {
    return T instanceof Integer; // impossible
    return T == Integer; // impossible
    return T.class == Integer.class // impossible
    return vec instanceof (Vector<Integer>); // impossible
}

但是,您可以编写一个使用类标记作为输入参数的方法

static <T> boolean checkElementType(Collection<?> collection, Class<T> elementType) {
    for (Object object : collection) {
        if (!elementType.isAssignableFrom(object.getClass())) {
            return false;
        }
    }
    return true;
}

然后您可以像这样使用它:

List<?> list1 = Arrays.asList(1, 2, 3);
List<?> list2 = Arrays.asList(1, 2, 3, "a");
System.out.println(checkElementType(list1, Integer.class)); // true
System.out.println(checkElementType(list2, Integer.class)); // false


 类似资料:
  • 我有一个具有如下结构的集合对象: 我该怎么办?非常感谢,很抱歉我的英语不好!

  • 问题内容: 通过使用Java反射,我们可以轻松知道对象是否为数组。判断对象是否为集合(Set,List,Map,Vector …)的最简单方法是什么? 问题答案:

  • 问题内容: 我是Node.js和Heroku的新手,我构建了一个使用node.js并从mongodb实例检索一些数据的小应用程序。我设置了整个程序,但是我的问题是我认为mongodb的语法很简单。 我需要在启动应用程序时知道我的收藏夹中是否包含任何东西,如果没有,则不进行初始化。我尝试调用collection.count(),但返回未定义。 我尝试这样做 任何帮助表示赞赏。 问题答案: 任何访问数

  • 问题内容: 有没有一种方法可以检查nodestore的firestore中是否存在子集合? 目前,我正在使用文档,但是我需要检查文档中是否存在子类以便写入一些数据。 问题答案: 就在这里。您可以使用docs.length来知道子集合是否存在。 我制作了一个样本来指导您,希望对您有所帮助。

  • 问题内容: 我有两种检查列表是否为空的方法 和 我的拱门告诉我,前者比后者更好。但是我认为后者更好。 任何人都可以澄清一下吗? 问题答案: 您应该 绝对 使用。计算任意列表的可能会很昂贵。即使确认是否有任何元素 可以 是昂贵的,当然,但没有优化不能 也 让速度更快,而相反的情况并非如此。 例如,假设你有一个链表结构,它 并没有 缓存的大小(而 做 )。然后将变为O(N)运算,而仍为。 当然,另外,