Groovy扩展为接收方传递null



我有一个扩展方法:

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总是null。

我可以直接调用静态方法:
CollectionIdioms.firstOrNull(["abc"]) 

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

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

如果你把你的描述符改成这样,它就可以工作了:

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

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

见项目网址:github.com/jeffbrown/listextension

应用程序/src/main/groovy/util/CollectionIdioms.groovy

package util
class CollectionIdioms {
static firstOrNull(List self) {
return (self == null || self.isEmpty()) ? null :  self.first()
}
}

应用程序/src/main/resources/meta - inf/服务/org.codehaus.groovy.runtime.ExtensionModule

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

应用程序/src/main/groovy/listextension/App.groovy

package listextension
class App {
static void main(String[] args) {
List<String> list = ["abc"]
println list.firstOrNull()
}
}

:

~ $ git clone git@github.com:jeffbrown/listextension.git
Cloning into 'listextension'...
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 24 (delta 0), reused 24 (delta 0), pack-reused 0
Receiving objects: 100% (24/24), 60.82 KiB | 1.60 MiB/s, done.
~ $ 
~ $ cd listextension 
listextension (main)$ 
listextension (main)$ ./gradlew run
> Task :app:run
abc
BUILD SUCCESSFUL in 4s
3 actionable tasks: 3 executed

最新更新