有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

集合如何确保Java对象的类型为Map<String,Object>

简短、一目了然的问题摘要(TLDR):我如何确保Java Object属于Map<String, Object>类型


我有一个YAML文档作为String。我使用SnakeYAML从Map<String, Object>创建YAML,但在我再次阅读之前,它可能会被篡改。我不想求助于PKI签名,只要看看YAML表示是否仍然是Map<String, Object>就足够了,即使Object值可能到处都是。我关心的是类型,而不是内容

那么:如何确保Object确实是Map<String, Object>类型

以下是我如何绕过各种类型擦除的警告:

Object yamlObject = yaml.load(someYamlDocumentAsString);
// I only want to proceed if this YAML object is a Map<String, Object>
if ((yamlObject instanceof Map<?, ?>)) {
  Map<?, ?> propertyMap = (Map<?, ?>) yamlObject;
  for (Entry<?, ?> propertyEntry : propertyMap.entrySet()) {
    // I am checking each key and throwing if it's not a "String"
    Object propertyKey = propertyEntry.getKey();
    if (!(propertyKey instanceof CharSequence)) {
      throw new BananaException("FIXME"); // FIXME
    }
  }
} else {
  throw new CoconutException("FIXME"); // FIXME
}

以上这些能做得更好吗

顺便说一句,我不认为Java有类似于C#的as关键字的东西(来自MSDN:The as运算符类似于强制转换操作。但是,如果转换不可能,as将返回null而不是引发异常)


在上面的代码之后,我是否可以安全地抑制以下警告:

@SuppressWarnings("unchecked")
Map<String, Object> aBeautifulAndCozyMap = (Map<String, Object>) propertyMap;

共 (1) 个答案

  1. # 1 楼答案

    由于类型擦除,信息在运行时是未知的,因此除了instanceofgetClass().getName()getDeclaredField("...").getGenericType().getActualTypeArguments()之外,没有其他方法来检查它

    我认为您应该留在^{{cd1>}中,因为它易于阅读,其他开发人员将很容易理解您想要做什么

    我喜欢例外;-)