给出了@NamedVariant
groovy transform的例子-一切都按预期工作:
import groovy.transform.NamedVariant
class A {
@NamedVariant
def func(String key1 = "val1", String key2 = "val2") {
print "key1=$key1, key=$key2"
}
}
new A().func(key2: "xxx")
但是当我把func
移到这样一个trait时:
import groovy.transform.NamedVariant
class A implements B {}
trait B {
@NamedVariant
def func(String key1 = "val1", String key2 = "val2") {
print "key1=$key1, key=$key2"
}
}
new A().func(key2: "xxx")
它无法编译,并显示以下错误消息:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
ideaGroovyConsole.groovy: -1: Error during @NamedVariant processing. Class B$Trait$Helper already has a named-arg method of type [org.codehaus.groovy.ast.Parameter@6fd1660[name: namedArgs, type: java.util.Map, hasDefaultValue: false]]
@ line -1, column -1.
groovy支持traits内部的@NamedVariant
转换吗?还是我做错了什么?
1条答案
按热度按时间kpbpu0081#
引用groovy关于traits和AST转换的文档:
性状与AST转换不兼容。其中一些,比如@ baseStatic将应用于trait本身(而不是实现类),而另一些将同时应用于实现类和trait。绝对不能保证AST转换会像在普通类上一样在trait上运行,所以使用它的风险自担!
NamedVariant
是一个AST转换,这在本质上意味着groovy文档告诉我们不能保证它会工作。我们可以通过查看
NamedVariant
的源代码来验证NamedVariant
是AST转换。