栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

*由于
类型擦除,


*泛型类型参数

在运行时不可恢复(某些特殊情况除外)。这意味着在运行时,

Vector<Integer>
Vector<String>
都只是
Vector
s,而它们的元素也只是
Object
引用。

只有

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

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

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

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

Vector<Integer> ints = new Vector<Integer>(); // emptyVector<String> strings = (Vector<String>) ints; // unchecked warning, but still possibly okints.add(1); // here comes troubleString 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)); // trueSystem.out.println(checkElementType(list2, Integer.class)); // false


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454980.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号