Java 抽象方法上的不同列表返回类型

Java 抽象方法上的不同列表返回类型,java,generics,inheritance,Java,Generics,Inheritance,我试图用抽象输出类的子类将返回类型与数据库函数调用分开。我遇到了这样一个问题:我的抽象方法(getResults)返回类型需要与日期、字符或字符串的ResultSet不同,但它们都应该属于输出类或接口。返回结果集的子类需要返回一个列表,日期应该返回列表,字符串列表,等等 客户端代码: LoadableStatement loadedStatementObject= new LoadableStatement.Builder() .addParam(new In(2, 11

我试图用抽象输出类的子类将返回类型与数据库函数调用分开。我遇到了这样一个问题:我的抽象方法(getResults)返回类型需要与日期、字符或字符串的ResultSet不同,但它们都应该属于输出类或接口。返回结果集的子类需要返回一个
列表
,日期应该返回
列表
,字符串
列表
,等等

客户端代码:

LoadableStatement loadedStatementObject= new LoadableStatement.Builder()
            .addParam(new In(2, 111111))
            .addParam(new Out(1, OracleTypes.CURSOR))
            .addStatement(DBPackage.LOOKUP_RECORD.getStatement())
            .load();
Output cursor = new Cursor(loadedStatementObject);
Output.java中的抽象方法和的子类

public class Output{
    //Constructor, fields etc...
    public abstract Collection getResults();
}


public class Cursor extends Output {
    private List<Map<String, Object>> results;

    public Cursor(LoadableStatement statement) {
        super(statement);
    }

    @Override
    public Collection getResults() {
        //Logic to convert some type of list from DB into a 
        //List<Map<String,Object>>
        return new ArrayList<Map<String, Object>>();
    }
}

public class StringResult extends Output {

    public StringResult(LoadableStatement statement) {
        super(statement);
    }

    @Override
    public Collection getResults() {
    //Logic that converts a list from DB into a List<String>
    }

}
公共类输出{
//构造函数、字段等。。。
公共摘要集合getResults();
}
公共类游标扩展输出{
私人名单结果;
公共游标(LoadableStatement语句){
超级(声明);
}
@凌驾
公共集合getResults(){
//将某种类型的列表从DB转换为
//名单
返回新的ArrayList();
}
}
公共类StringResult扩展了输出{
公共StringResult(LoadableStatement语句){
超级(声明);
}
@凌驾
公共集合getResults(){
//将列表从DB转换为列表的逻辑
}
}

我怎样才能做到这一点

试试这样的方法:

public class LoadableStatement {}

public abstract class Output<E> {
  //Constructor, fields etc...
  public abstract Collection<E> getResults();
  public Output(LoadableStatement statement) {
    /* Some implementation ... */
  }

}

public class Cursor extends Output<Map<String, Object>> {
  private List<Map<String, Object>> results;

  public Cursor(LoadableStatement statement) {
    super(statement);
  }

  @Override
  public Collection<Map<String, Object>> getResults() {
    //Logic to convert some type of list from DB into a 
    //List<Map<String,Object>>
    return new ArrayList<>();
  }
}

public class StringResult extends Output<String> {

  public StringResult(LoadableStatement statement) {
    super(statement);
  }

  @Override
  public Collection<String> getResults() {
    //Logic that converts a list from DB into a List<String>
    return new ArrayList<>();
  }

}
公共类LoadableStatement{}
公共抽象类输出{
//构造函数、字段等。。。
公共摘要集合getResults();
公共输出(LoadableStatement语句){
/*一些实现*/
}
}
公共类游标扩展输出{
私人名单结果;
公共游标(LoadableStatement语句){
超级(声明);
}
@凌驾
公共集合getResults(){
//将某种类型的列表从DB转换为
//名单
返回新的ArrayList();
}
}
公共类StringResult扩展了输出{
公共StringResult(LoadableStatement语句){
超级(声明);
}
@凌驾
公共集合getResults(){
//将列表从DB转换为列表的逻辑
返回新的ArrayList();
}
}

您应该定义输出类的通用版本。具有泛型返回类型的泛型函数。以下是一些示例代码:

public class Output<T>{
//fields and constructor
public T getResults(); 
}
公共类输出{
//字段和构造函数
公共T getResults();
}
这里的T表示您可以使用任何标识符的类型


注意:在使用集合时,请记住集合中不允许使用原语。

到目前为止,您尝试了什么?我尝试过使用泛型,但我确信是错误的。我已经尝试了列表,收集,然后分享你所做的。拉文德拉,我添加了代码。