[英]How to check if Object is instanceof HashMap<?,?>[] in Java?
我在 java 中有一个 HashMaps 数组
HashMap<String, String>[] convertTags = new HashMap[1];
HashMap<String, String> tag = new HashMap<>();
tag.put("key", "test-tag");
tag.put("value", "test-value");
convertTags[0] = tag;
在另一个 class 中,我将这个 convertTags object 传递给一个 function,它接受一个通用的 Z497031794414A3B544。 根据 object 的类型,我想运行不同的代码。 但是,当我有一个 if 语句来检查 HashMaps 数组的实例时,它似乎无法识别我的 convertTags object。
public static void function (Object obj) {
...
if (obj instanceof HashMap<?, ?>[]) {
//do stuff
}
}
我错过了什么吗? 在 convertTags object 上调用.getClass() 返回class [Ljava.util.HashMap;
使用instanceof
进行类型检查时,不能使用泛型类型作为检查:必须使用原始类型。 这样做的原因很简单:大多数泛型类型信息在编译时被删除,在运行时不再存在。 对于运行时的 JVM,这些类型是相同的: List<T>
、 List<String>
、 List<Hashmap<E>>
和List
。 如果 Java 允许使用泛型类型进行instanceof
操作,可能会导致严重的类型错误。
事实上,允许这样的操作并不完全正确:
if (obj instanceof Hashmap<?,?>[]) { ...
编译器允许这样做,因为无界通配符类型是 Java 中存在的唯一类型的具体化generics。 许多作者不鼓励在这种情况下使用无界通配符,因为它们可能暗示使用其他(不可具体化)泛型类型是有效的。 相反,这是最好使用原始类型的罕见情况:
if (obj instanceof Hashmap[]) { ...
Hashmap<?,?>[] map = (Hashmap<?,?>[]) obj
:
:
因为已经检查了类型,所以强制转换是合法的,上面的代码段不会发出编译器警告。
如果需要有关Hashmap
中的类型的运行时信息,您可以考虑两种方法(可以混合使用):
function()
以获取键和/或值的类型参数Class<T>
对象作为键和值类型的运行时类型标记传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.