如何实现通用接口和可读代码?

时间:2014-07-17 16:34:11

标签: java generics interface

我在JAVA中有以下设计问题:我有以下接口I1,我想使用多个类A1,A2,...但是getGain方法中的参数 应具体到实施A1,A2 ....

public interface I1{  public Double getGain(I2 i2);}

I2本身就是一个具有两个实现B1,B2的接口。

然后我有两个实现此接口I1的类:A1,A2

 Class A1 implements I1{ 
       @Override  getGain(I2 i2){
       // here I expect the implementation B1 of class I2, 
       //as I may need to create new B1(...)
 }

 Class A2 implements I1{
    @Override
    getGain(I2 i2){
        //here I expect the implementation B2 of class I2, 
        //as I may need to create new B2(...)
    }

解决方案1:

public interface I1<K extends I2>{
    public Double getGain(K i2);
}

但是我会添加这个&lt;&gt;在使用I1的任何类中,根本不可读。

解决方案2: 失去I1中的通用性并最终拥有

public interface I1{    
    public Double getGain(C1 i1);
}
public interface I2{    
    public Double getGain(C2 i2);
}

有更好的解决方案吗?

我的意思是,现在让我说我有一些其他泛型类,例如一个应该返回I1的方法,应该是 通用以及我必须在计算器中携带I1的通用性:

class P<K extends I2{
    I1<K> getI();
}

此外,如果现在我还有另外2个接口J2,K2。 现在如果I1<I extends I2, J extends J2, K extends K2>

我有

class P<I extends I2, J extends J2, K extends K2>{
    I1<I> get1();
    J1<J> get2();
    K1<K> get3();
}

也许这是正常的,但我更像是仿制药的新手:)

2 个答案:

答案 0 :(得分:0)

  

但是我会在使用I1的任何类中添加此<>,这根本不可读。

这是完全合理的。大多数Java开发人员都准备在实现泛型类时再输入两个字符。

您的解决方案1是一种普遍接受的方式,在这种情况下,它将为您提供最佳的可读性和代码重用。

答案 1 :(得分:0)

即使我们接受你的前提,即泛型类名称(其中包含<>的名称)是&#34;不可读&#34;,假设您只希望两个类实现I1,那么您的大多数代码都会可能直接引用A1和A2类。这些类名称不具有任何通用参数。