Grails 使用具有不同返回类型的闭包参数在Groovy中重载方法

Grails 使用具有不同返回类型的闭包参数在Groovy中重载方法,grails,groovy,Grails,Groovy,就我的工作要求而言,我对Groovy相当精通,但没有OOP背景意味着我仍然无法理解某些事情,因此,如果这里的某些措辞有点偏离,我深表歉意(如果您能让问题更清楚,请随意编辑) 我试图创建一个重载方法,其中签名(理想情况下)仅在单个闭包参数的返回类型上不同。闭包包含一个方法调用,该方法调用返回ItemResponse或ListResponse对象,这两个对象都可以包含任何类型的一个或多个对象(这是我想要推断的类型) 下面的代码是我尝试实现的简化版本—一种错误处理方法,它引用服务调用,安全地尝试解决它

就我的工作要求而言,我对Groovy相当精通,但没有OOP背景意味着我仍然无法理解某些事情,因此,如果这里的某些措辞有点偏离,我深表歉意(如果您能让问题更清楚,请随意编辑)

我试图创建一个重载方法,其中签名(理想情况下)仅在单个闭包参数的返回类型上不同。闭包包含一个方法调用,该方法调用返回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
}
publicttestmethod(闭包testCall){
testCall.call().item作为T
}
公共列表测试方法(闭包测试调用){
testCall.call().items作为T
}
显然,这是行不通的,但是否有其他方法/解决办法可以实现预期的结果

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

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

class Demo {
    int doit() {}
    String doit() {}
}
我试图创建一个重载方法,其中签名 (理想情况下)仅在单个闭合的返回类型上不同 参数

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

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

正如您和@jeffscottbrown所提到的,不能有两个参数相同但返回值不同的方法。我在这里看到的解决方法是使用回调闭包。
testMethod
的返回值将默认为
对象
,并且您将提供一个“unwrapper”,它将在闭包调用(提取
)后显示位。在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)
类别价值持有人{
T值
}
闭包c={
[1]
}
闭包d={
新的价值持有人(价值:'hello world')
}
闭包liu={List l->
l、 第一()
}
关闭vhsu={价值持有人vh->
vh值
}
//这是通用方法
公共对象测试方法(闭包测试调用、闭包展开器){
将(testCall.call())作为T展开
}
println测试方法(c,liu)
println测试方法(d,vhsu)

它同时适用于列表或值持有者

正如您和@jeffscottbrown提到的,不能有两个参数相同但返回值不同的方法。我在这里看到的解决方法是使用回调闭包。
testMethod
的返回值将默认为
对象
,并且您将提供一个“unwrapper”,它将在闭包调用(提取
)后显示位。在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)
类别价值持有人{
T值
}
闭包c={
[1]
}
闭包d={
新的价值持有人(价值:'hello world')
}
闭包liu={List l->
l、 第一()
}
关闭vhsu={价值持有人vh->
vh值
}
//这是通用方法
公共对象测试方法(闭包测试调用、闭包展开器){
将(testCall.call())作为T展开
}
println测试方法(c,liu)
println测试方法(d,vhsu)

它同时适用于列表或值持有者

是的,我知道。我只包含代码片段来演示我要实现的目标。我在问,是否有任何方法可以真正实现代码理想的功能do@Tom您说过“我正在尝试创建一个重载方法,其中签名(理想情况下)只在返回类型上不同”。那是不可能的。这就是我要说的。是的,我知道。我只包含代码片段来演示我要实现的目标。我在问,是否有任何方法可以真正实现代码理想的功能do@Tom您说过“我正在尝试创建一个重载方法,其中签名(理想情况下)只在返回类型上不同”。那是不可能的。这就是我所说的。