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

标签 generics groovy delegates default

我有一个通用类,它封装了各种类型的对象。因为我使用的是泛型,所以我不能使用 @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/

相关文章:

java - 如何在java中获取ParameterizedType的通用容器类

c# - 用抽象类型实现抽象类

groovy - Alfresco Activiti - 创建同一子流程的多个实例

linux - 如何从 Tomcat 网络应用运行 PhantomJS

c# - 在 C# 4.0 中,是否可以从泛型类型参数派生类?

c# - 为什么 C# 编译器使用隐式运算符返回的值的父类型来调用重载运算符

powershell - 将 Powershell 脚本的返回值分配给 Groovy 变量

ios - 澄清 Objective-C 协议(protocol)和授权

c# - 隐式转换为 Func 或 Action 委托(delegate)?

ios - Objective-C:如何为使用方法执行结果的方法提供完成 block