gpt4 book ai didi

generics - Groovy - 将 DefaultGroovyMethods 方法委托(delegate)给通用对象

转载 作者:行者123 更新时间:2023-12-02 01:02:45 35 4
gpt4 key购买 nike

我有一个通用类,它封装了各种类型的对象。因为我使用的是泛型,所以我不能使用 @delegate 注释(因为它不适用于泛型、def 或对象类型)。相反,我利用 methodMissing 和 propertyMissing 方法来传递对封装对象的方法调用和属性访问。我遇到的问题是如何将调用委托(delegate)给 DefaultGroovyMethods 添加的方法(each、collect、unique 等)。我已尝试执行以下操作:

protected void setObject(T object)
{
// Save the object
this.object = object

// Delegate all the default Groovy methods to the object
DefaultGroovyMethods.class.methods*.name.unique().each({ name ->
this.metaClass.'static'."${name}" = this.object.&"${name}"
})
}

不幸的是,这根本不起作用。甚至可以通过元类覆盖默认的 Groovy 方法吗?如果是,那么需要更改什么才能使其正常工作?

最佳答案

不确定这是否是您想要的,但您的意思是这样的?

@groovy.transform.TupleConstructor
class Wrapper<T> {
T wrapped

def methodMissing(String name, args) {
if(wrapped.respondsTo(name)) {
wrapped."$name"(*args)
}
else {
throw new MissingMethodException(name, Wrapper, args)
}
}

def propertyMissing(String name) {
if(wrapped.hasProperty(name)) {
wrapped."$name"
}
else {
throw new MissingPropertyException(name, Wrapper)
}
}

String toString() {
"Wrapper(${wrapped.toString()})"
}
}

Wrapper<String> str = new Wrapper('tim')
assert str.length() == 3
assert str.bytes == [116, 105, 109]

关于generics - Groovy - 将 DefaultGroovyMethods 方法委托(delegate)给通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550118/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com