Generics Groovy-将DefaultGroovyMethods方法委托给泛型对象

Generics Groovy-将DefaultGroovyMethods方法委托给泛型对象,generics,groovy,delegates,default,Generics,Groovy,Delegates,Default,我有一个封装各种类型对象的泛型类。因为我使用泛型,所以不能使用@delegate注释(因为它不适用于泛型、def或对象类型)。相反,我利用methodMissing和propertyMissing方法传递方法调用和对封装对象的属性访问。但我遇到的问题是如何将调用委托给DefaultGroovyMethods添加的方法(each、collect、unique等)。我已尝试执行以下操作: protected void setObject(T object) { // Save the objec

我有一个封装各种类型对象的泛型类。因为我使用泛型,所以不能使用@delegate注释(因为它不适用于泛型、def或对象类型)。相反,我利用methodMissing和propertyMissing方法传递方法调用和对封装对象的属性访问。但我遇到的问题是如何将调用委托给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}"
  })
}

不幸的是,这根本不起作用。甚至可以通过meta类重写默认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]
@groovy.transform.TupleConstructor
类包装器{
T包装
def methodMissing(字符串名称,args){
如果(包装响应到(名称)){
已包装。“$name”(*args)
}
否则{
抛出新的MissingMethodException(名称、包装器、参数)
}
}
def propertyMissing(字符串名称){
if(wrapped.hasProperty(名称)){
已包装。“$name”
}
否则{
抛出新的MissingPropertyException(名称、包装器)
}
}
字符串toString(){
“包装器(${wrapped.toString()})”
}
}
包装器str=新包装器('tim')
断言str.length()==3
assert str.bytes==[116、105、109]

不确定这是不是你想要的,但你的意思是这样的

@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]
@groovy.transform.TupleConstructor
类包装器{
T包装
def methodMissing(字符串名称,args){
如果(包装响应到(名称)){
已包装。“$name”(*args)
}
否则{
抛出新的MissingMethodException(名称、包装器、参数)
}
}
def propertyMissing(字符串名称){
if(wrapped.hasProperty(名称)){
已包装。“$name”
}
否则{
抛出新的MissingPropertyException(名称、包装器)
}
}
字符串toString(){
“包装器(${wrapped.toString()})”
}
}
包装器str=新包装器('tim')
断言str.length()==3
assert str.bytes==[116、105、109]

这段代码真不错!您需要什么
@tupleconstructor
?要覆盖继承的构造函数,请保存我键入的接受
T
;-)的构造函数#懒鬼要找的就是这个<代码>包装器列表=新包装器([1,2,3]);断言[1,2,3]==list.collect()。能够委托给
DefaultGroovyMethods
中提供的方法。这段代码真不错!您需要什么
@tupleconstructor
?要覆盖继承的构造函数,请保存我键入的接受
T
;-)的构造函数#懒鬼要找的就是这个<代码>包装器列表=新包装器([1,2,3]);断言[1,2,3]==list.collect()。能够委托给
DefaultGroovyMethods
中提供的方法。