gpt4 book ai didi

java - 如何确保 Java 对象的类型为 Map

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:12:07 34 4
gpt4 key购买 nike

问题的简短概览 (TLDR):如何确保 Java Object类型为 Map<String, Object>


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

那么:我如何确保 Object确实是 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 运算符类似于强制转换操作。但是,如果无法进行转换,则返回 null 而不是引发异常。)?


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

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

最佳答案

由于类型删除,信息在运行时是未知的,因此除了 instanceofgetClass().getName()getDeclaredField("...").getGenericType().getActualTypeArguments() 事情。

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

PS:我喜欢异常(exception)情况;-)

关于java - 如何确保 Java 对象的类型为 Map<String, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375106/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com