提问人:Maciek 提问时间:10/7/2023 最后编辑:Maciek 更新时间:10/11/2023 访问量:73
特征中的 Groovy 命名参数
Groovy named parameters in traits
问:
给定的 groovy 转换示例 - 一切都按预期工作:@NamedVariant
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.
时髦的支持是改变了内部特征还是我做错了什么?@NamedVariant
答:
3赞
Matias Bjarland
10/11/2023
#1
特征与 AST 转换不正式兼容。其中一些(如@CompileStatic)将应用于特征本身(而不是实现类),而另一些则同时应用于实现类和特征。绝对不能保证 AST 转换会像在常规类上一样在特征上运行,因此使用它的风险由您自己承担!
NamedVariant
是一种 AST 转换,实质上意味着时髦的文档告诉我们,不能保证这会起作用。
我们可以通过查看 here 和 here 的源代码来验证这是 AST 转换。NamedVariant
NamedVariant
评论
groovy.lang.MissingMethodException: No signature of method: A.func() is applicable for argument types: (LinkedHashMap) values: [[key2:xxx]]