Различные возвращаемые типы List для абстрактного метода - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь отделить типы возвращаемых данных от вызовов функций базы данных с помощью подклассов абстрактного класса Output. Я столкнулся с проблемой, когда мой тип возвращаемого значения абстрактного метода (getResults) должен отличаться для ResultSet от Date, char или string, но все они должны попадать в класс Output или интерфейс. Подкласс, который возвращает ResultSet, должен возвращать List<Map<String,Object>>, Date должен возвращать List<Date>, String List<String> и т. Д. *

Код клиента:

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>
    }

}

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Попробуйте что-то вроде этого:

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<>();
  }

}
0 голосов
/ 03 октября 2019

Вы должны определить общую версию класса Output. Который имеет универсальную функцию с универсальным типом возврата. Вот пример кода:

public class Output<T>{
//fields and constructor
public T getResults(); 
}

здесь T для Типа, вы можете использовать любой идентификатор.

Примечание. При использовании коллекций имейте в виду, что примитивы не допускаются в коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...