2017-09-05 1 views
1

Ich habe drei Klassen ein:Dynamisch Klasse-Typ und Klasse für OpenCSVReader Mapping

  • Elternklasse Parent
  • Kind Klasse ChildClass1, die von Parent erbt
  • Kind Klasse ChildClass2, die von Parent erbt

In ParentClass gibt es nur eine Methode, die von den untergeordneten Klassen vererbt wird. Beide untergeordneten Klassen haben unterschiedliche Felder und Getter und Setter (Getter und Setter werden im Codebeispiel nicht angezeigt). Die Kindklassen sind Darstellungen von CSV-Dateien (OpenCSVReader). Obwohl dies nicht mit meinem Problem zusammenhängt, sind die Felder nur der Vollständigkeit halber mit Anmerkungen versehen.

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 
} 

Außerdem habe ich eine Methode in einer ganz anderen Klasse. Dies sind die ersten Zeilen des Verfahrens mit der OpenCSVReader (weiter in dem Verfahren auch CsvToBean usw. verwendet wird - nicht dargestellt, da es nicht notwendig, das Problem selbst):

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); 

Was ich versuche zu erreichen, ist zu Ändern Sie den Klassentyp in der HeaderColumnNameTranslateMappingStrategy und auch die statische Klasse in strat.setType dynamisch, so dass ChildClass1 und 2 und auch weitere ChildClasses in diesem Kontext verwendet werden können. Mit anderen Worten, ich möchte diese Parameter als Argumente an die Methode compareFiles() übergeben.

Ich habe schon versucht, Generika, aber ich habe es bisher nicht funktioniert. Wahrscheinlich sind Generika die Lösung, aber ich kenne dieses Konzept nicht sehr gut.

Ich hoffe, ich habe das Problem klar genug beschrieben. Wenn nicht, zögern Sie nicht, über einen Kommentar zu fragen.

Antwort

1

Verwenden Sie ein generic method, wie folgt aus:

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); 
    ... 

und rufen Sie es wie folgt aus:

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