能否使用SnakeYAML解析对象映射?遇类型转换问题求助
问题解答
功能完全可行,你遇到的问题是因为Java泛型的类型擦除机制,导致SnakeYAML无法自动识别ItemMap中值的具体类型,只能默认将嵌套的YAML结构解析为LinkedHashMap。
解决方法有两种:
方法1:直接使用TypeReference指定泛型类型(推荐)
不需要自定义ItemMap类,直接通过TypeReference明确告诉SnakeYAML目标类型是Map<String, Item>:
Map<String, Item> result = new Yaml().loadAs(yaml, new TypeReference<Map<String, Item>>() {});
这样SnakeYAML就能正确将每个嵌套节点实例化为Item对象,避免类型转换异常。
方法2:保留自定义ItemMap,配合TypeReference解析
如果一定要使用自定义的ItemMap类,解析时同样需要用TypeReference来传递泛型信息:
ItemMap result = new Yaml().loadAs(yaml, new TypeReference<ItemMap>() {});
因为单纯传递ItemMap.class时,运行时无法获取它的泛型参数<String, Item>,而TypeReference可以保留这份类型信息。
为什么原方法失败?
Java的泛型在编译后会被擦除,ItemMap.class在运行时只表示它是HashMap的子类,SnakeYAML无法得知它的泛型参数类型,所以只能将YAML中的嵌套结构默认解析为LinkedHashMap,导致后续类型转换报错。
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

