В тех случаях, когда я хочу выполнить синтаксический анализ из JSON в объект домена, который я определил как содержащий коллекцию перечислений, я обнаружил, что Groovy не принуждает содержимое коллекции автоматически, чего, как я полагаю, в любом случае не следует ожидать, поскольку дженерики являются проблема времени компиляции.
Если я наивно выполняю приведение типов к проанализированному JSON, мои коллекции будут содержать строки во время выполнения, что приведет к сбою сравнения элементов коллекции с перечислениями независимо от значения.
Альтернативой является переопределение установщика для коллекции enum и выполнение приведения к каждому элементу. Это показано в приведенном ниже примере.
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
Подход с переопределенным сеттером решает мою проблему, но кажется, что это немного ванильно, и мне было интересно, поддерживает ли Groovy более разумный способ распространения приведения типов.