我有一个扩展方法:
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