Почему в моем коде у меня проблема наследования? Создайте объект, передающий специализированный тип вместо объявленного абстрактного супертипа - PullRequest
0 голосов
/ 16 марта 2020

Работая с приложением Java Я обнаружил следующую проблему, связанную с наследованием.

У меня следующая ситуация:

1) Я определил абстрактный класс named TrendFromExcelAbstract . Этот класс содержит некоторые базовые c поля, общие для других классов, которые расширяют его и представляют различные вкладки файла Excel (но это сейчас не важно):

public abstract class TrendFromExcelAbstract {

    private Long id;
    private String date;
    private String time;
    private String excelDocumentName;
    private String excelDocumentSheet;

    public TrendFromExcelAbstract() {
        super();
    }

    public TrendFromExcelAbstract(Long id, String date, String time, String excelDocumentName,
            String excelDocumentSheet) {
        super();
        this.id = id;
        this.date = date;
        this.time = time;
        this.excelDocumentName = excelDocumentName;
        this.excelDocumentSheet = excelDocumentSheet;
    }
    ................................................................
    ................................................................
    GETTER AND SETTER METHODS
    ................................................................
    ................................................................
}

Тогда у меня есть класс с именем CompVibrAndTempDTO расширение предыдущего абстрактного класса:

public class CompVibrAndTempDTO extends TrendFromExcelAbstract {

    // Temperature reading point
    private String tempReadingPointA;
    private String tempReadingPointB;
    private String tempReadingPointC;
    private String tempReadingPointD;
    private String tempReadingPointE;
    private String tempReadingPointF;
    private String tempReadingPointG;
    private String tempReadingPointH;
    private String tempReadingPointI;
    private String tempReadingPointJ;
    private String tempReadingPointK;
    private String tempReadingPointL;
    private String tempReadingPointM;
    private String tempReadingPointN;
    private String tempReadingPointO;
    private String tempReadingPointP;

    // Vibration reading point
    private String vibrReadingPointA;
    private String vibrReadingPointB;
    private String vibrReadingPointC;
    private String vibrReadingPointD;
    private String vibrReadingPointE;
    private String vibrReadingPointF;
    private String vibrReadingPointG;
    private String vibrReadingPointH;
    private String vibrReadingPointI;
    private String vibrReadingPointJ;
    private String vibrReadingPointK;
    private String vibrReadingPointL;

    public CompVibrAndTempDTO() {
        super();
    }

    public CompVibrAndTempDTO(Long id, String date, String time, String excelDocumentName, String excelDocumentSheet,
            String tempReadingPointA, String tempReadingPointB, String tempReadingPointC, String tempReadingPointD, 
            String tempReadingPointE, String tempReadingPointF, String tempReadingPointG, String tempReadingPointH, 
            String tempReadingPointI, String tempReadingPointJ, String tempReadingPointK, String tempReadingPointL,
            String tempReadingPointM, String tempReadingPointN, String tempReadingPointO, String tempReadingPointP,
            String vibrReadingPointA, String vibrReadingPointB, String vibrReadingPointC, String vibrReadingPointD, 
            String vibrReadingPointE, String vibrReadingPointF, String vibrReadingPointG, String vibrReadingPointH,
            String vibrReadingPointI, String vibrReadingPointJ, String vibrReadingPointK, String vibrReadingPointL) {

         ........................................................................................................................
         ........................................................................................................................
         ........................................................................................................................
    }

    ........................................................................................................................
    ........................................................................................................................
    GETTER AND SETTER METHODS
    ........................................................................................................................
    ........................................................................................................................
}

Затем у меня есть другой класс DTO с именем ExcelTabGeneralInfoDTO , например:

public class ExcelTabGeneralInfoDTO {

    private String excelDocumentName;
    private String excelSheetName;

    private List<TrendFromExcelAbstract> trendOfTabList;

    public ExcelTabGeneralInfoDTO() {
        super();
    }

    public ExcelTabGeneralInfoDTO(String excelDocumentName, String excelSheetName,
            List<TrendFromExcelAbstract> trendOfTabList) {
        super();
        this.excelDocumentName = excelDocumentName;
        this.excelSheetName = excelSheetName;
        this.trendOfTabList = trendOfTabList;
    }
..................................................................
..................................................................
GETTER AND SETTER METHODS
..................................................................
..................................................................
}

Как вы можете видеть этот класс содержит это поле списка:

private List<TrendFromExcelAbstract> trendOfTabList;

Идея состоит в том, что это поле представляет список любых объектов, которые являются производными от TrendFromExcelAbstract

Проблема заключается в том, что в другом класс Я пытаюсь сделать что-то вроде этого:

public List<ExcelTabGeneralInfoDTO> getCompVibrAndTempTab() {

    List<CompVibrAndTempDTO> tabTrendList = excelRepo.findCompVibrAndTempTab();
    String excelDocumentName;
    String excelSheetName;

    if(tabTrendList.size() >=0 ) {
        excelDocumentName = tabTrendList.get(0).getExcelDocumentName();
        excelSheetName = tabTrendList.get(0).getExcelDocumentSheet();
    }

    ExcelTabGeneralInfoDTO result = new ExcelTabGeneralInfoDTO(excelDocumentName, excelSheetName, tabTrendList);

    return result;

}

Так в основном в этой строке:

ExcelTabGeneralInfoDTO result = new ExcelTabGeneralInfoDTO(excelDocumentName, excelSheetName, tabTrendList);

Я пытаюсь создать новый ExcelTabGeneralInfoDTO , передавая к нему список tabTrendList , имеющий тип List .

Я получаю следующее сообщение об ошибке:

Description Resource    Path    Location    Type
The constructor ExcelTabGeneralInfoDTO(String, String, List<CompVibrAndTempDTO>) is undefined   ExcelServiceImpl.java   /energy-prg-be/src/main/java/com/springboot/excelapi/services   line 425    Java Problem

Description Resource    Path    Location    Type
Type mismatch: cannot convert from List<ExcelTabGeneralInfoDTO> to List<CompVibrAndTempDTO> ExcelResource.java  /energy-prg-be/src/main/java/com/springboot/excelapi/resources  line 167    Java Problem

Моя идея состоит в том, что я могу использовать более общий тип (ExcelTabG eneralInfoDTO) и затем передайте дочерний тип (CompVibrAndTempDTO). Но, похоже, мое предположение неверно. Что не так? Что мне не хватает? Почему я не могу сделать что-то подобное? Как я могу это исправить?

1 Ответ

0 голосов
/ 16 марта 2020

ExcelTabGeneralInfoDTO не имеет определенного конструктора для List<CompVibrAndTempDTO>, только для List<TrendFromExcelAbstract>. Попробуйте объявить tabTrendList как List<TrendFromExcelAbstract> и посмотрите, работает ли он.

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