簡體   English   中英

使用具有不同返回類型的Closure參數重載Groovy中的方法

[英]Overloading a method in Groovy using Closure arguments with different return types

就我的工作要求而言,我對Groovy相當熟練,但沒有OOP的背景知識意味着有些事情仍然困擾着我,因此,如果此處的措辭有些偏離,我們深表歉意。問題更清晰)。

我正在嘗試創建一個重載方法,該方法的簽名(理想情況下)僅在單個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
}

顯然這是行不通的,但是是否有其他替代方法/解決方法可以達到預期的效果?

我正在嘗試創建一個重載方法,該方法的簽名(理想情況下)僅在單個Closure參數的返回類型上有所不同。

您不能這樣做,因為返回類型不是方法簽名的一部分。 例如,以下無效:

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

正如您自己和@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)

它適用於列表或值持有者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM