2015-08-14 182 views
1

我有許多類,POJO風格,共享單個功能,說readCSV方法。所以我想用這些POJO可以擴展的單個父級(或者抽象的,不知道是否應該)。下面是一個僞代碼:Java - 具體類擴展的泛型類

(abstract) class CSVUtil { 

    private String[] fileHeader = null; 

    protected void setFileHeader(fileHeader) { 
     this.fileHeader = fileHeader; 
    } 

    protected List<WhateverChildClass> readCSV(String fileName) { 

     // read CSV using Apache Commons CSV 
     // and return a List of child type 

     List<WhateverChildClass> list = null; 
     // some declarations 

     try { 

      list = new ArrayList<WhateverChildClass>(); 

      csvParser = new CSVParser(fileReader, csvFormat); 

      List csvRecords = csvParser.getRecords(); 

      for (...) { 
       CSVRecord record = (CSVRecord) csvRecords.get(i); 

       WhateverChildClass childClass = new WhateverChildClass(); 

       // loop through fields of childClass using reflection and assign 
       for (// all fields of childClass) { 
        childClass.setWhateverField(record.get(fileHeader[i])); 
       } 

       list.add(childClass); 

       System.out.println(p); 
       ps.add(p); 
      } 
     } 
     ... 

     return list; 
    } 
} 

在子類中的一個,說ChildA

class ChildA extends CSVUtil { 

    // fields, getters, setters 

} 

我如何readCSV編碼的CSVUtil,這樣我可以在運行時確定的子類中在父類中定義?

是否有可能使這個方法是靜態的並仍然被繼承?

作爲一種替代方法,Apache Commons CSV中是否存在API,通常可以讀取CSV,確定其模式,並將其包裝爲通用對象(我不知道這裏是否合理),然後返回列表無論對象是什麼?

回答

1

你想讓readCSV成爲一個靜態方法嗎?

的話,我會說,ChildA類不應該從CSVUtil繼承,但實現一個接口......類似的東西:

public final class CSVUtil { 

    private CSVUtil() { 
    } 

    public static <T extends ICSV> List<T> readCSV(String filename) { 
    ... 
    } 


class ChildA implements ICSV