2016-06-13 76 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