特征中的 Groovy 命名参数

Groovy named parameters in traits

提问人:Maciek 提问时间:10/7/2023 最后编辑:Maciek 更新时间:10/11/2023 访问量:73

问:

给定的 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

groovy 命名参数

评论

0赞 chubbsondubs 10/10/2023
因此,使用特征摘录是行不通的,但与您发布的原因不同。我看到 Trait B 的 @NamedVariant 结果groovy.lang.MissingMethodException: No signature of method: A.func() is applicable for argument types: (LinkedHashMap) values: [[key2:xxx]]
0赞 Maciek 10/11/2023
也许它因 Groovy 版本而异?我在 4.0.15 上运行

答:

3赞 Matias Bjarland 10/11/2023 #1

引用关于特征和 AST 转换的时髦文档

特征与 AST 转换不正式兼容。其中一些(如@CompileStatic)将应用于特征本身(而不是实现类),而另一些则同时应用于实现类和特征。绝对不能保证 AST 转换会像在常规类上一样在特征上运行,因此使用它的风险由您自己承担!

NamedVariant是一种 AST 转换,实质上意味着时髦的文档告诉我们,不能保证这会起作用。

我们可以通过查看 here 和 here 的源代码来验证这是 AST 转换。NamedVariantNamedVariant