以下两种将*(arr+2)
转换为Object
的方法有什么区别?假设两种方法都可以将Map
转换为Object
,那么哪种方法更好?
发布:
Map
ObjectMapper:
Object o = some object;
Map<String, Object> map = (Map<String, Object>) o;
答案 0 :(得分:2)
没有“更好的”。有实际差异。但是首先,这两个选项都使用类型转换,这引发了一个问题:“这两个选项到底怎么被考虑?”
仅当some object
通过instanceof Map
测试(第一个选项)或o
通过instanceof String
测试(第二个选项)时,铸造才能工作。
换句话说,答案取决于some object
的运行时类。
所以这将因类强制转换异常而失败:
(Map<String, Object>) o;
否则这将因相同的异常而失败:
(String) o
假定类型检查将通过一种方法,则应考虑以下差异:
some object
与Map<String, Object>
兼容,则应首选强制转换,因为它具有性能优势(可以考虑使用objectMapper.convertValue
)。实际上,readValue
甚至都不是选项,因为转换为字符串将失败。some object
是一个字符串,那么您只能调用readValue
,因为您需要解析JSON。如上所述,还有objectMapper.convertValue
,它以智能的方式先检查instanceof
,然后再通过JSON解析执行转换。如果两种类型具有相同的字段,则意味着将对象从一种类型转换为另一种类型。
答案 1 :(得分:1)
这取决于输入的内容。
(Map<String, Object>) o
用于casting转换,因此o
的运行时类型必须为Map
,否则将抛出ClassCastException
:< / p>
Object o = new HashMap<>();
Map<String, Object> map = (Map<String, Object>) o; // ok
Object o = new ArrayList<>();
Map<String, Object> map = (Map<String, Object>) o; //ClassCastException
Object o = new String();
Map<String, Object> map = (Map<String, Object>) o; //ClassCastException
ObjectMapper().readValue(String content, JavaType valueType)
:
从给定的JSON内容字符串反序列化JSON内容的方法。
,这意味着输入应为有效json格式的String
。例如:
Object input = "{\"key1\":{},\"key2\":{}}";
Map<String, Object> map = new ObjectMapper().readValue((String) input, new TypeReference<Map<String, Object>>() {});
System.out.println(map.size()); // 2