我有以下常规代码:
def script
String credentials_id
String repository_path
String relative_directory
String repository_url
CredentialsWrapper(script, credentials_id, repository_name, repository_group, relative_directory=null) {
this(script, credentials_id, 'git@gitlab.foo.com:' + repository_group +'/' + repository_name + '.git', relative_directory);
}
CredentialsWrapper(script, credentials_id, repository_url, relative_directory=null) {
this.script = script;
this.credentials_id = credentials_id;
this.repository_url = repository_url;
if (null == relative_directory) {
int lastSeparatorIndex = repository_url.lastIndexOf("/");
int indexOfExt = repository_url.indexOf(".git");
this.relative_directory = repository_url.substring(lastSeparatorIndex+1, indexOfExt);
}
}
詹金斯给了我以下内容:
由于在第30行第7列的构造函数中发生哈希冲突,因此无法编译com.foo.CredentialsWrapper类。
我不明白为什么,构造函数不同,它们没有相同数量的参数。
此外,“脚本”是“工作流脚本”的一个实例,但我不知道应导入什么以访问该类,这将允许我显式声明脚本而不是使用“ def”
有什么想法吗?
答案 0 :(得分:2)
当您使用四个参数调用构造函数时,您要调用第一个还是第二个?
如果您使用默认值编写构造函数/方法,groovy实际上会生成两个或多个版本。 所以
Test(String x, String y ="test")
将导致
Test(String x, String y) {...}
和
Test(String x) {new Test(x, "test")}
因此您的代码想编译为4个构造函数,但其中包含带有签名的构造函数
CredentialsWrapper(def, def, def, def)
两次。
如果我正确理解您的代码,则可以省略=null
中的一个或两个。结果将是相同的,但是您将仅获得两个或三个签名。然后,您可以通过调用具有正确参数计数的两个版本来进行选择。