java抽象class用于继承

java abstract class for inheritance

我有一个项目,我目前正在使用 org.apache.poi

将 excel 文件中的记录加载到数据库中

我将 3 种文件加载到不同的 Dto classes 中。 其中两个 dto 共享相同的基 class(它们具有共同的属性)

@Getter
@Setter
@ToString
public class PpyRecordDTO {

private String units;
private Double quantity;

}

@Getter
@Setter
@ToString
public class FirstRecordDTO extends RecordDTO {
private String normDescription;
private String relatedUnits;

}


@Getter
@Setter
@ToString
public class SecondRecordDTO extends RecordDTO{

private String normName;
}

@Getter
@Setter
@ToString
public class ThirdRecordDTO {

private String code;
}

ThirdRecordDto class 具有独特的属性,并且与基本 dto class RecordDTO

没有共享属性

我想从这个方法中 return 基础 class : RecordDto(但 ThirdRecordDTO 不能扩展它,因为没有公共字段)

    public static List<?extends RecordDTO> readPpyExcelFile(MultipartFile file, SourceType sourceType){
    //TODO: making readPpyExcelFile generic
    try {
        Workbook workbook = WorkbookFactory.create(new BufferedInputStream(file.getInputStream()));

        Sheet sheet = workbook.getSheetAt(0);
        Iterator<Row> rows = sheet.iterator();

        List<? extends RecordDTO> lstRecords = processRecords(rows, sourceType);

        // Close WorkBook
        workbook.close();

        return lstRecords;
    } catch(ApiGenericException apiException){
        throw new ApiGenericException(apiException.getStatus(), apiException.getMessage(), apiException.getErrorType());
    } catch (Exception e) {
        logger.error(e.getMessage());
        throw new ApiGenericException(HttpStatus.INTERNAL_SERVER_ERROR,"Enable while loading the file", ApiErrorType.Unhandled
        );
    }
}

有没有一种方法可以使 dto ThirdRecordD 也被 return 编辑或继承自其他 dto 共享的抽象 class 以便 return 类型 < ?从此方法扩展列表?

一般来说,你可以这样选择:

public interface Ppy {
 // common methods if any
}

public class PpyRecordDTO implements Ppy{...}
public class FirstRecordDTO extends PpyRecordDTO {...} // so that it also implements Ppy interface
public class SecondRecordDTO extends PpyRecordDTO {...} // the same as above
public class ThirdRecordDTO implements Ppy {...} // Note, it doesn't extend PpyRecordDTO but implements the interface

现在在方法中,可以:

 public static List<Ppy> readPpyExcelFile(MultipartFile file, SourceType sourceType){...}

这会起作用,但是,您应该问自己以下问题:调用此方法的代码将做什么,即它将如何区分不同的实现? 如果接口有一个对所有实现都有意义的通用方法——很好,它将能够调用该方法。例如,如果它有一个像 render(Page) 之类的方法,代码可能是:

List<Ppy> ppis = readPpyExcelFile(...);
Page page = ...
for(Ppy ppi : ppis) {
    ppi.render(page);
} 

但是,如果该接口没有任何通用方法 - 它也无济于事。当子对象可以被视为父对象的特化(以便子对象“是”父对象)时,使用继承。所以想想继承在这里是否真的合适,假设 ThirdRecordDTO 与 类.

的其余部分没有任何共同点