【问题标题】:Overloading a method in Groovy using Closure arguments with different return types使用具有不同返回类型的闭包参数重载 Groovy 中的方法
【发布时间】:2016-01-15 12:39:06
【问题描述】:

就我的工作需要而言,我对 Groovy 相当精通,但没有 OOP 方面的背景意味着我仍然无法理解某些事情,所以如果这里的某些措辞有点离题,请见谅(如果您愿意,请随时编辑可以让问题更清晰)。

我正在尝试创建一个重载方法,其中签名(理想情况下)仅在单个 Closure 参数的返回类型上有所不同。 Closure 包含一个方法调用,该方法调用返回一个 ItemResponse 或 ListResponse 对象,这两个对象都可以包含任何类型的对象/对象(这是我想推断的类型)。

以下代码是我尝试实现的简化版本 - 一种错误处理方法,它引用服务调用,安全地尝试解决它,并根据需要从响应中返回项目/项目:

public <T> T testMethod(Closure<ItemResponse<T>> testCall) {
    testCall.call().item as T
}

public <T> List<T> testMethod(Closure<ListResponse<T>> testCall) {
    testCall.call().items as T
}

显然这行不通,但是否有任何替代方法/解决方法可以达到预期结果?

【问题讨论】:

    标签: grails groovy


    【解决方案1】:

    我正在尝试创建一个重载方法,其中签名 (理想情况下)仅在单个闭包的返回类型上有所不同 参数。

    您不能这样做,因为返回类型不是方法签名的一部分。例如,以下内容无效:

    class Demo {
        int doit() {}
        String doit() {}
    }
    

    【讨论】:

    • 是的,我知道这一点。我只包含了代码 sn-p 来演示我想要实现的目标。我在问是否有任何方法可以实际执行该代码理想会执行的操作
    • @Tom 你说“我正在尝试创建一个重载方法,其中签名(理想情况下)仅在返回类型上有所不同”。那是做不到的。这就是我要解决的问题。
    【解决方案2】:

    正如你自己和@jeffscottbrown 所提到的,你不能有两个具有相同参数但返回值不同的方法。我在这里看到的解决方法是使用回调闭包。 testMethod 的返回值将默认为 Object,并且您将提供一个“解包器”,它将在闭包调用之后进行位(提取 itemitems)。在您的 GroovyConsole 中尝试一下:

    class ValueHolder <T> {
        T value
    }
    
    Closure<List<Integer>> c = {
        [1]
    }
    
    Closure<ValueHolder<String>> d = {
        new ValueHolder(value:'hello world')
    }
    
    Closure liu = {List l ->
        l.first()
    }
    
    Closure vhsu = {ValueHolder vh ->
        vh.value
    }
    
    // this is the generic method
    public <T> Object testMethod(Closure<T> testCall, Closure<T> unwrapper) {
        unwrapper(testCall.call()) as T
    }
    
    println testMethod(c, liu)
    println testMethod(d, vhsu)
    

    它适用于列表或价值持有者。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 2015-06-09
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多