我正在尝试编写一个通用方法,将不同类型的 Java Bean(例如 List<JavaBean>
)写入文件。我目前正在构建一个 FileManager
实用类。每个 Java Bean 都实现相同的接口(interface)。这是我正在尝试做的事情的示例。
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 writeToCsvFile(String filename, List<Data> data) { file writing logic goes here }
}
我希望能够通过 List<RecipeData>
和一个 List<DemographicData>
到这个方法。显然我所拥有的不起作用。
我似乎无法执行以下操作:
List<Data> data = new ArrayList<RecipeData>();
这通常是如何完成的?在 Swift 中我可能会使用 as?关键字将其转换为正确的类型。
****************编辑****************
作为序言,我使用 SuperCSV 库来帮助将行解析为 Java Bean,并且我使用下面接受的答案作为方法定义。所以我有以下代码:
Data dataset;
while((dataset = beanReader.read(Data.class, nameMappings, processors)) != null ) {
container.add(dataset);
}
我收到以下错误:
The method add(capture#1-of ? extends Data) in the type List is not applicable for the arguments (Data)
数据集需要是 RecipeData 或 DemographicData 类型才能工作,我认为。有没有一种简单的方法可以解决这个问题,以便将来添加更多 Bean 时可以灵活地使用?
最佳答案
final public class FileManager {
public static void writeToCsvFile(String filename, List<? extends Data> data) { file writing logic goes here }
}
此外,您还可以声明
List<Data> data = new ArrayList<RecipeData>();
作为
List<Data> data = new ArrayList<Data>();
或者,在 Java 7 中,
List<Data> data = new ArrayList<>();
然后用 RecipeData 填充它,因为无论哪种方式,您都会丢失此 List
仅包含 RecipeData
关于Java:将实现相同接口(interface)的不同自定义对象传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797020/