传递实现类而不是接口时的 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)

issuecom.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的主要内容,如果未能解决你的问题,请参考以下文章

UIStoryboardSegue - performSegue 方法传递类而不是标识符

带有 POJO 类而不是接口的 GWT AutoBean

无法将 osgi 服务 bean 公开为类而不是接口

设计模式初识

重构以避免在使用抽象类而不是接口时进行多重继承

Java 8 - 与默认方法和抽象类的接口