正在为接收方传递空值Groovy扩展

g9icjywg  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个扩展方法:

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始终为空。
我可以直接调用static方法:

CollectionIdioms.firstOrNull(["abc"])

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

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

nxagd54h1#

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

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

您已经初始化了用于静态扩展方法的staticExtensionClasses。您正在添加示例扩展方法。您的方法在CollectionIdioms类中的定义正确地是静态的,但要添加的扩展方法实际上是示例方法。
请参阅github.com/jeffbrown/listextension上的项目。
app/src/main/groovy/util/CollectionIdioms.groovy

package util

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

app/src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule

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

app/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

相关问题