给出了
@NamedVariant
groovy 变换的示例 - 一切都按预期工作:
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
移动到这样的特征时:
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 支持
@NamedVariant
会改变内部特征还是我做错了什么?
引用关于特征和 AST 转换的 groovy 文档:
Traits 与 AST 转换不正式兼容。其中一些(例如@CompileStatic)将应用于特征本身(而不是实现类),而其他一些将应用于实现类和特征。绝对不能保证 AST 转换会像在常规类上一样在特征上运行,因此使用它需要您自担风险!
我相信
NamedVariant
是一个 AST 转换,本质上意味着 groovy 文档告诉你不能保证这会起作用。