[英]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
並且您將提供一個“解包器”,該解包器將在閉包調用之后(提取item
或items
)開始執行。 在您的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.