Groovy中Trait内用@NamedVariant报错,是否支持该用法?
问题分析与解决方案
Groovy的@NamedVariant注解在Trait中使用确实存在兼容性问题,并非你的操作错误。
原因说明
Groovy中Trait的底层实现会自动生成辅助类(如报错信息中的B$Trait$Helper),而@NamedVariant注解处理器在处理Trait方法时,会尝试为其生成带Map类型参数的命名参数重载版本。但Trait的辅助类生成逻辑与注解的方法生成逻辑冲突,导致重复创建了相同签名的方法,最终触发编译错误。
可行解决方案
方案1:将@NamedVariant移至实现类
把注解从Trait的方法上移除,放到实现类的重写方法上:
import groovy.transform.NamedVariant class A implements B { @NamedVariant @Override def func(String key1 = "val1", String key2 = "val2") { super.func(key1, key2) } } trait B { def func(String key1 = "val1", String key2 = "val2") { print "key1=$key1, key=$key2" } } new A().func(key2: "xxx")
方案2:手动实现命名参数重载
不依赖@NamedVariant,手动编写带Map参数的重载方法来支持命名参数调用:
class A implements B {} trait B { def func(String key1 = "val1", String key2 = "val2") { print "key1=$key1, key=$key2" } // 手动实现命名参数版本 def func(Map args) { func(args.getOrDefault('key1', "val1"), args.getOrDefault('key2', "val2")) } } new A().func(key2: "xxx")
这个问题属于Groovy注解处理器对Trait支持的已知限制,当前稳定版本中暂未完全修复,上述方案可作为临时替代方案使用。
内容的提问来源于stack exchange,提问作者Maciek
相关产品推荐
相关产品推荐

