Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现通用接口和可读代码?_Java_Generics_Interface - Fatal编程技术网

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

Java 如何实现通用接口和可读代码?,java,generics,interface,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 expe

我在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(...)
 }

解决方案1:

public interface I1<K extends I2>{
    public Double getGain(K i2);
}
有更好的解决办法吗

我的意思是,现在让我们假设我有一些其他的泛型类,比如一个方法,它应该返回I1,并且应该是 同样,我必须在计算器中携带I1的通用性:

class P<K extends I2{
    I1<K> getI();
}
P类
但是,我将在任何使用I1的类中添加此
,因为I1根本不可读

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


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

即使我们接受您的前提,即通用类名(其中包含
的名称)是“不可读的”,因为您希望只有两个类实现I1,您的大多数代码可能会直接引用类A1和A2。这些类名没有任何泛型参数。

什么是
getCol
?这是打字错误吗?我不同意解决方案1会导致不好的可读性。同意@kocko——我认为这是最好的。我唯一能想到的另一件事是让
A1
A2
在运行时使用
instanceof
检查它们的参数是否具有预期的类型,否则抛出异常。但是您失去了在编译时进行检查的能力。@ajb是的,这是一个打字错误。谢谢您花时间回答。我已经编辑了以上问题,感谢您抽出时间回答。我在上面编辑了我的问题,你是否在所有答案上复制和粘贴相同的评论?我是新来的,如果我只评论一个答案,我不知道是否每个人都会得到更新…谢谢你花时间回答。我已经编辑了上面的问题
public interface I1{    
    public Double getGain(C1 i1);
}
public interface I2{    
    public Double getGain(C2 i2);
}
class P<K extends I2{
    I1<K> getI();
}
class P<I extends I2, J extends J2, K extends K2>{
    I1<I> get1();
    J1<J> get2();
    K1<K> get3();
}