如何解决用于继承的java抽象类
我有一个项目,我目前正在使用 from org.apache.poi 将 excel 文件中的记录加载到数据库
我将 3 种文件加载到不同的 Dto 类中。 其中两个 dtos 共享相同的基类(它们具有共同的属性)
@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 类具有唯一的属性,并且与基类 dto 类 RecordDTO 没有共享属性
我想从这个方法返回基类: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 ThirdRecordDto 也返回或继承自其他 dto 共享的抽象类以返回类型 从此方法扩展列表?
解决方法
一般来说,您可以使用以下方法:
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
与其他类没有任何共同之处,请考虑继承是否真的适合这里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。