Java:将实现相同接口(interface)的不同自定义对象传递给方法

标签 java

我正在尝试编写一个通用方法,将不同类型的 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/

相关文章:

java - 在方法中获取 SharedPreferences 的上下文

java - tomcat 在 html 中显示 404 错误,但 jsp 工作正常

Javafx Scene.snapshot方法性能低下

java - Bigquery 流 API 返回 "unsupported content with type"

java - 只是我想在 Maven 项目构建失败时创建目标

java - 使用 lucene 保持查询统计

java |按键监听器 |基本的

java SWT透明复合背景

java - 有没有办法将表行保存到 Firebase 中?实时还是 Firestore?

java - 显示来自 Web 应用程序的系统托盘通知或桌面通知