java方法可以根据条件返回值吗?

dev*_*v ツ 15 java design-patterns

我有一个ICoreClient接口,AClient并且BClient类实现了这一点.

ICoreClient 暴露给用户.

我需要在ICoreClient界面中添加一个新方法.因此,它需要在两个客户端中实现.我不能使这种方法通用,因为它具有完全不同的签名但功能相似.

我有2个接口xx和yy

ClientA实现xx和ClientB实现yy

所以,我决定添加一个新testMethod的ICoreClient,它将为我提供xx或yy取决于客户的实例.

我想根据条件从单个方法返回这些接口的实例.

在ClientA:

public xx testMethod(){
  return instanceof xx;
}
Run Code Online (Sandbox Code Playgroud)

在ClientB:

public yy testMethod(){
  return instanceof yy;
}
Run Code Online (Sandbox Code Playgroud)

我应该在ICoreClient界面中写什么?

public zz testMethod()
Run Code Online (Sandbox Code Playgroud)

我尝试了一个虚拟接口 zz(作为一个常见的超类型),xx并yy正在实现这一点.但还是没能揭露的方法xx,并yy在最后为它得到的类型强制转换各自的客户zz.

对于这种情况,有没有任何已知的方法?

编辑:如果我返回类型Object,则不公开这些接口的方法.虽然,Object包含xxor 的实例yy,

用户仍然需要将它转换为(xx或yy用户将如何知道?)以使用接口中的方法..我想暴露ClientX无需转换的方法ClientA或ClientB...

Psh*_*emo 38

编辑后,您可能正在寻找泛型.你可以像这样制作你的界面

interface ICoreClient<T>{// T will be set by each class implementing this interface
    T testMethod();
}
Run Code Online (Sandbox Code Playgroud)

你的每个课程都可以看起来像

class ClientA implements ICoreClient<xx>{
    xx testMethod(){
        //return xx
    }
}

class ClientB implements ICoreClient<yy>{
    yy testMethod(){
        //return yy
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在编辑之后,问题发生了很大变化,这似乎很合适.+1 (3认同)

Era*_*ran 16

只有xx并且yy具有共同的超类型(接口或类)才有可能.在最坏的情况下,您始终可以返回Object.

public Object testMethod () // or a more specific common super type of `xx` and `yy`
{    
    if (..some condition..) {
        return ..instanceof `xx`..;
    } else if (..other condition..) {
        return ..instanceof `yy`..;
    }
    return null; // or some other default instnace
}
Run Code Online (Sandbox Code Playgroud)

  • `+ l`为常见的超类型.它应该是那个或单独的方法. (4认同)
  • 这个问题是..对象将包含`xx`或`yy`的实例..但是用户仍然需要对它进行类型转换以使用接口中的方法.. OP想要的是暴露`XClient的方法'无需进行类型转换.. (3认同)