传递实现类而不是接口时的 MissingMethodException
Posted
技术标签:
【中文标题】传递实现类而不是接口时的 MissingMethodException【英文标题】:MissingMethodException when passing an implementing class instead of an interface 【发布时间】:2022-01-06 14:32:46 【问题描述】:我正在开发一个关于 Jira 工作流的脚本(使用 Adaptavist Scriptrunner v.6.34),我遇到了一个问题,即 groovy 不接受接口实现作为其签名允许实现接口的函数的参数。
代码
import com.atlassian.jira.issue.link.DefaultRemoteIssueLinkManager;
(...)
def remoteLink = DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue(issue)
(issue
是 com.atlassian.jira.issue.IssueImpl
类型的构建变量)
会发生什么
groovy.lang.MissingMethodException: No signature of method: static com.atlassian.jira.issue.link.DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue() is applicable for argument types: (com.atlassian.jira.issue.IssueImpl) values: [ADA-24684]
Possible solutions: getRemoteIssueLinksForIssue(com.atlassian.jira.issue.Issue)
at Script6.run(Script6.groovy:32)
方法文档是here
方法签名需要Issue(接口)类型的参数
我传递的参数类型为IssueImpl
我不明白 groovy 怎么不接受接口实现。
到目前为止我尝试了什么
将我的变量转换为Issue
类型
将我的变量转换为类型Issue
将我的变量转换为类型MutableIssue
(the first-level inherited interface)
将我的变量转换为类型MutableIssue
将我的变量转换为类型AbstractIssue
(the first-level inherited class)
将我的变量转换为类型AbstractIssue
所有这些情况都返回了原始异常。
我已经打印了类的方法和接口,并且所有内容都与文档匹配,因此这里没有版本不匹配。
我不知道还能做什么,因为它超出了我的 java/groovy 知识。我问过哪些是 Java 专家的同事,他们没有找到这种行为的原因。有什么想法吗?
【问题讨论】:
【参考方案1】:DefaultRemoteIssueLinkManager.getRemoteIssueLinksForIssue(issue)
这是试图在 DefaultRemoteIssueLinkManager
类上调用名为 getRemoteIssueLinksForIssue
的静态方法。貌似没有这样的方法,你看到的错误和那个是一致的。
您在docs.atlassian.com/software/jira/docs/api/8.19.0/com/atlassian/jira/issue/link/DefaultRemoteIssueLinkManager.html#getRemoteIssueLinksForIssue-com.atlassian.jira.issue.Issue- 链接的方法是实例方法,而不是静态方法。
【讨论】:
“我询问了 Java 专家的同事,他们没有找到导致这种行为的原因。”询问他们上面的静态方法描述是否对他们有意义。如果他们是 Java 专家,我希望他们会。 好的,你能告诉我文档上哪里有明确说明吗?或者,至少,静态方法的文档在哪里? “好的,你能告诉我文档上哪里有明确的说明吗?” - 有点。默认的 javadoc 模板不会生成任何标记来表示成员是 not 静态的,因此在 javadoc 中缺少该成员是表示某事是实例方法的标准方式。例如,docs.atlassian.com/software/jira/docs/api/8.19.0/com/atlassian/… 表示该成员是static
。
“或者,至少,静态方法的文档在哪里?” - 据我所知,该类上没有具有该名称的静态方法,如果我对此正确,那么该静态方法没有任何文档。
如果你运行像String.substring(4)
这样简单的东西,你会看到一个非常相似的错误信息。问题是您正在调用一个不存在的静态方法,但恰好与实例方法具有相同的名称。以上是关于传递实现类而不是接口时的 MissingMethodException的主要内容,如果未能解决你的问题,请参考以下文章