Java - Общий класс, расширенный конкретным классом

У меня есть несколько классов, стиль POJO, которые разделяют одну функциональность, скажем, метод readCSV. Поэтому я хочу использовать один родительский (или, может быть, абстрактный, не уверенный, должен ли) класс, который могут расширять эти POJO. Вот псевдокод:

(abstract) class CSVUtil {

    private String[] fileHeader = null;

    protected void setFileHeader(fileHeader) {
        this.fileHeader = fileHeader;
    }

    protected List<WhateverChildClass> readCSV(String fileName) {

        // read CSV using Apache Commons CSV
        // and return a List of child type

        List<WhateverChildClass> list = null;
        // some declarations

        try {

            list = new ArrayList<WhateverChildClass>();

            csvParser = new CSVParser(fileReader, csvFormat);

            List csvRecords = csvParser.getRecords();

            for (...) {
                CSVRecord record = (CSVRecord) csvRecords.get(i);

                WhateverChildClass childClass = new WhateverChildClass();

                // loop through fields of childClass using reflection and assign
                for (// all fields of childClass) { 
                    childClass.setWhateverField(record.get(fileHeader[i]));
                }

                list.add(childClass);

                System.out.println(p);
                ps.add(p);
            }
        }
        ...

        return list;
    }
}

на одном из детских классов, скажем, ChildA

class ChildA extends CSVUtil {

    // fields, getters, setters

}

Как мне кодировать CSVUtil так, чтобы я мог определить во время выполнения дочерний класс в readCSV, определенный в родительском классе?

Можно ли сделать этот метод статичным и все же наследоваться?

В качестве альтернативы, есть ли в Apache Commons CSV API, который обычно может читать CSV, определять его схему и оборачивать его как универсальный объект (я не знаю, имею ли я здесь смысл) и возвращать список того или иного объекта является?

1 ответ

Решение

Вы хотите, чтобы readCSV был статическим методом?

Тогда я бы сказал, что класс ChildA не должен наследоваться от CSVUtil, но должен реализовывать интерфейс... что-то вроде этого:

public final class CSVUtil {

  private CSVUtil() {
  }

  public static <T extends ICSV> List<T> readCSV(String filename) {
    ...
  }


class ChildA implements ICSV
Другие вопросы по тегам