【问题标题】:Groovy - Delegate DefaultGroovyMethods methods to generic objectGroovy - 将 DefaultGroovyMethods 方法委托给通用对象
【发布时间】:2014-10-24 14:35:43
【问题描述】:

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

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 方法吗?如果是,那么需要进行哪些更改才能使其正常工作?

【问题讨论】:

    标签: generics groovy delegates default


    【解决方案1】:

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

    @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]
    

    【讨论】:

    • 一段非常棒的代码!你需要什么@TupleContructor?涵盖继承的构造函数?
    • 保存了我输入一个接受 T 的构造函数 ;-) #lazy
    • OP 正在寻找的是这个。 Wrapper&lt;List&gt; list = new Wrapper([1, 2, 3]); assert [1, 2, 3] == list.collect()。能够委托给DefaultGroovyMethods中提供的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多