我正在尋找從通用框架調用特定接口的好替代方案。我將用代碼來舉例說明。請看問題部分,示例代碼主要是爲了徹底性,並將該示例放入真實場景中。類型安全實現的Java通用接口
示例
假設我們要基於組件列表構建報告。假設我們有兩個特定組件類型:
public interface Component { ... }
public class PDFComponents extends Component { ... }
public class WordComponents extends Component { ... }
每個組件都有一個報表製作工具實現,例如,
public interface ReportBuilder { ... }
public class PDFReportBuilder extends ReportBuilder { ... }
public class WordReportBuilder extends ReportBuilder { ... }
它建立特定的報表實現
public interface Report { ... }
public class PDFReport extends ReportBuilder { ... }
public class WordReport extends ReportBuilder { ... }
最後我們有定位服務組件並從組件生成報告。
public class ReportService {
ReportComponentRepository repo;
List<ReportBuilder> builders;
public <T extends Report> T getReport(Class<T> reportType) {
// Get report components. E.g., this might return List<PDFComponent>
List<Component> reportComponents = repo.getReportComponents(id);
// Build report from components using one of the registered builders
for (ReportBuilder builder : builders) {
if (builder.buildFor(reportType) {
return builder.buildReport(report);
}
}
}
}
例如,使用服務
List<PDFReport> reports = new ReportService().getReport(PDFReport.class);
問題
我們的問題。我如何設計一個通用的ReportBuilder接口,允許類型安全實現?
例如,選擇界面:
public Report buildReport(List<? extends Component> components);
會導致醜陋,在它的實現:
public class PDFReportBuilder implements ReportBuilder {
@Override
public Report buildReport(List<? extends Component> components) {
PDFReport report;
for (Component component : components) {
if (component instanceOf PDFComponent) {
// assemble report ...
report.includeComponent(component);
}
}
return report;
}
}
當我們真正想要的界面爲PDFReportBuilder是如
public Report buildReport(List<PDFComponent> component) { ... }
要實現的接口,而不是延長他們的,我想簡化的界面,'PDFReport'實現'Report',和類/接口名稱之後的括號不是真的存在。 – 2010-09-12 19:47:01
你是對的。從我的文章來看,我發現我對一些細節很粗心。現在已經糾正了。 – 2010-09-12 19:51:17