动态设置OpenCSVReader Mapping

时间:2017-09-05 12:55:37

标签: java opencsv

我有三个班级:

  • 父类ParentClass
  • 继承自ParentClass
  • 的子类ChildClass1
  • 继承自ParentClass
  • 的子类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以及更多ChildClasses。换句话说,我想将这些参数作为参数传递给方法compareFiles()

我已经尝试过泛型,但到目前为止它还没有用。可能是泛型是解决方案,但我对这个概念并不是很熟悉。

我希望我能够清楚地描述这个问题。如果没有,请不要犹豫,通过评论询问。

1 个答案:

答案 0 :(得分: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);