【问题标题】:Groovy Extension being passed null for receiverGroovy Extension 被传递给接收者 null
【发布时间】:2022-12-12 12:00:04
【问题描述】:

我有一个扩展方法:

static <T> T firstOrNull(List<T> self) {
    return (self == null || self.isEmpty()) ? null : (T) self.first()
}

构建和编译。但是,当我调用它时:

List<String> list = ["abc"]
assert list.firstOrNull() == "abc"

self 始终为空。

我可以直接调用静态方法:

CollectionIdioms.firstOrNull(["abc"]) 

返回正确的结果。这是我的META-INF/services/org.codehaus.groovy.runtime.ExtensionModule

moduleName=Groovy Extensions
moduleVersion=1.0
extensionClasses=
staticExtensionClasses=util.CollectionIdioms

【问题讨论】:

  • 什么是 groovy 版本?
  • meta-inf 在哪里?它是罐子的一部分吗?你是如何加载罐子的?
  • @dagget 它在 Jar 文件中,由打开静态标志的代码使用。 groovy 版本是 2.5.15。今天晚些时候我会尝试把它放在一个小项目中。我可能会那样偶然发现解决方案。

标签: groovy


【解决方案1】:

如果您将描述符更改为如下所示,它会起作用:

moduleName=Groovy Extensions
moduleVersion=1.0
extensionClasses=util.CollectionIdioms

您已经初始化了 staticExtensionClasses,它用于静态扩展方法。您正在添加一个实例扩展方法。 CollectionIdioms 类中方法的定义正确地是静态的,但添加的扩展方法实际上是一个实例方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多