2017-09-05 46 views
1

我有三類:動態設置類型和類OpenCSVReader映射

  • 父類的父類
  • 子類ChildClass1從父類繼承
  • 子類ChildClass2它繼承自父類

在ParentClass中只有一個方法會被子類繼承。兩個子類都有不同的字段和getter和setter(getter和setter不在代碼示例中顯示)。 子類是csv文件(OpenCSVReader)的表示。雖然這與我的問題沒有關係,但爲了完整起見,這些字段用約束條件進行了註釋。

public class ParentClass { 
    public boolean myMethod(){ 
    } 
} 

public class ChildClass1 extends ParentClass{ 
    @NotNull 
    private String child1Field1 

    @NotNull 
    private String child1Field2 
} 

public class ChildClass2 extends ParentClass{ 
    @NotNull 
    private String child2Field1 

    @NotNull 
    private String child2Field2 
} 

此外,我有一個完全不同的類的方法。這些都是使用OpenCSVReader方法的第一線(進一步的方法也CsvToBean等使用 - 沒有顯示,因爲它是沒有必要的問題本身):

private boolean compareFiles(File created, File template, ReportType reportType, Class<ChildClass1> reportClass) throws Exception{ 

    CSVReader readerTest = new CSVReader(new FileReader(created),';','\''); 
    CSVReader readerTemplate = new CSVReader(new FileReader(template), ';', '\''); 

    HeaderColumnNameTranslateMappingStrategy<ChildClass1> strat = new HeaderColumnNameTranslateMappingStrategy<>(); 
    strat.setType(reportClass); 

我試圖實現的是動態更改HeaderColumnNameTranslateMappingStrategy中的類類型以及 strat.setType中的靜態類,以便可以在此上下文中使用ChildClass1和2以及更多的ChildClass。換句話說,我想將這些參數作爲參數傳遞給方法compareFiles()

我已經嘗試過仿製藥,但目前爲止它還沒有工作。可能泛型是解決方案,但我對這個概念並不是很熟悉。

我希望我能夠清楚地描述問題。如果不是,請不要猶豫,通過評論問。

回答

1

使用generic method,像這樣:

private <T extends ParentClass> boolean compareFiles(
    File created, 
    File template, 
    ReportType reportType, 
    Class<T> reportClass 
) throws Exception { 
    ... 
    HeaderColumnNameTranslateMappingStrategy<T> strat = new HeaderColumnNameTranslateMappingStrategy<>(); 
    strat.setType(reportClass); 
    ... 

並調用它像:

compareFiles(created,template,reportType,ChildClass1.class); 
... 
compareFiles(created,template,reportType,ChildClass2.class);