3

简短、一目了然的问题摘要 (TLDR):我如何确保 JavaObject是 type 的Map<String, Object>


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

那么:我如何确保 anObject确实是 type Map<String, Object>

这是我试图规避类型擦除的各种 SuppressWarnings 的方法:

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:as运算符就像一个强制转换操作。但是,如果转换是不可能的,那么 as 返回 null 而不是引发异常。)?


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

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

1 回答 1

1

由于类型擦除,信息在运行时是未知的,所以除了instanceof,getClass().getName()getDeclaredField("...").getGenericType().getActualTypeArguments()things 之外没有其他方法可以检查它。

在我看来,您应该继续使用它,instanceof因为它易于阅读,并且其他开发人员很容易理解您想要做什么。

PS:我喜欢例外;-)

于 2012-09-11T18:44:59.967 回答