traits中的Groovy命名参数

ymdaylpp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(77)

给出了@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转换吗?还是我做错了什么?

kpbpu008

kpbpu0081#

引用groovy关于traits和AST转换的文档:
性状与AST转换不兼容。其中一些,比如@ baseStatic将应用于trait本身(而不是实现类),而另一些将同时应用于实现类和trait。绝对不能保证AST转换会像在普通类上一样在trait上运行,所以使用它的风险自担!
NamedVariant是一个AST转换,这在本质上意味着groovy文档告诉我们不能保证它会工作。
我们可以通过查看NamedVariant的源代码来验证NamedVariant是AST转换。

相关问题