繁体   English   中英

如何检查 Object 是否是 HashMap 的实例<!--?,?--> []在Java?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM