在我想要将JSON解析为包含枚举集合的领域对象时,我发现Groovy不会自动强制转换集合的内容,这也许是可以预料的,因为泛型是一个编译时的关注点。如果我对解析后的JSON进行类型强制转换,那么我的集合在运行时将包含字符串,无论其值如何,都会导致与枚举元素的比较失败。另一种选择是覆盖枚举集合的setter并对每个元素进行强制转换。下面的示例说明了这一点。
import groovy.json.*
enum Hero {
BATMAN, ROBIN
}
class AClass {
Collection<Hero> heroes
}
class BClass {
Collection<Hero> heroes
void setHeroes(Collection heroes){
this.heroes = heroes.collect { it as Hero }
}
}
class CClass {
AClass a
BClass b
}
def json = '''
{
"a":
{
"heroes":["BATMAN", "ROBIN"]
},
"b":
{
"heroes":["BATMAN", "ROBIN"]
}
}
'''
def c = new JsonSlurper().parseText(json) as CClass
assert c.a.heroes[0].class == String
assert c.b.heroes[0].class == Hero
覆盖setter方法的方式解决了我的问题,但似乎这种方法有些朴素,我在想Groovy是否支持更智能的类型转换传播方式。