2016-06-13 74 views
0

我真的很努力地使用通配符/泛型。我正在嘗試創建一個FileManager實用程序類,它可以接受自定義Java Beans並將讀/寫Bean寫入文件。舉個例子,假設我有一個名爲Data的接口,它由RecipeDataDemographicData實現。我正在使用Super CSV將CSV文件轉換爲Java Bean。這是我的閱讀方法,它基於從Super CSV發現的教程代碼。Java:通配符/泛型的問題

public interface Data { method declarations } 
public class RecipeData implements Data { class stuff goes here } 
public class DemographicData implements Data { class stuff goes here } 

final public class FileManager { 
    public static void parseCsvFile(String filename, CellProcessor[] processors, String[] nameMappings, List<? extends Data> container) { 
     ICsvBeanReader beanReader = null; 
     try { 
      beanReader = new CsvBeanReader(new FileReader(filename), CsvPreference.STANDARD_PREFERENCE); 

      Data data; 
      while((data = beanReader.read(Data.class, nameMappings, processors)) != null) { 
       container.add(data); 
      } 
     } finally { 
      if (beanReader != null) { 
       beanReader.close(); 
      } 
     } 
    } 
} 

目前,我發現了以下錯誤:

The method add(capture#1-of ? extends Data) in the type List is not applicable for the arguments (Data)

我不知道我在做什麼,甚至有可能。這個想法是,通過的container可以是RecipeDataDemographicData。所以我認爲一個問題是data應該是這兩種類型。

任何人都可以提供有關我如何可能解決這個問題或如果它甚至會工作的反饋?編輯: 我真的不確定這是可能的。

+3

在你的泛型中,你說'extends' - 它應該改爲'Data',因爲'RecipeData'和'DemographicData'實現了並且不擴展'Data'接口。這樣,你使用「接口作爲一種類型」模式。順便說一下,你可以顯示你在哪裏調用'writeToCsvFile'來查看你傳遞給函數的內容? – ishmaelMakitla

+2

也可以看看PECS原理,如[這裏]解釋(http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)。總結:如果你只想添加元素到集合中,使用'Collection <?超級數據>'。 –

+0

嗨,我敢肯定你使用擴展,無論它是一個類或正在使用的接口。 'nameMappings'和'處理器'工作正常。我已經在非泛型寫入函數上對它進行了相當大的測試,所以這不是問題。至於我通過的'容器',它在另一個類中聲明爲'List container = new ArrayList ();' –

回答

0

而不是使用通配符List<? extends Data> container,請使用List<Data> container

+1

如果你解釋了爲什麼會起作用,你的答案會更具信息性。 – VGR