【问题标题】:Java: Passing different custom objects that implement same interface to method [duplicate]Java:将实现相同接口的不同自定义对象传递给方法[重复]
【发布时间】:2016-06-13 18:44:30
【问题描述】:

我正在尝试编写一个通用方法,将不同类型的 Java Bean(所以 List<JavaBean>)写入文件。我目前正在构建一个FileManager 实用程序类。每个 Java Bean 实现相同的接口。这是我正在尝试做的一个示例。

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&lt;RecipeData&gt;List&lt;DemographicData&gt; 传递给此方法。显然我所拥有的不起作用。

似乎我什至无法做到以下几点:

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);
}

我收到以下错误:

类型List中的add(capture#1-of ? extends Data)方法不适用于参数(Data)

dataset 需要是 RecipeData 或 DemographicData 类型才能正常工作。有没有一种简单的方法可以解决这个问题,以便将来添加更多 Bean 时灵活?

【问题讨论】:

  • 您收到的错误是什么?
  • List&lt;? implements Data&gt; data = new ArrayList&lt;RecipeData&gt;();
  • 更新了底部的帖子,我收到了错误。我正在使用接受的答案方法声明。

标签: java


【解决方案1】:
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 的信息

【讨论】:

  • 当我以这种方式声明我的方法时,这会给我一个编译器错误“数据无法解析为类型”。
  • 嗯.. Data 是否导入到 FileManager 类中?
  • 它在同一个包中,所以我认为没关系。如果你说的是真的,我可以不做:public static void writeToCsvFile(String filename, List data)
  • 在刷新似乎可以工作的项目后,它确实给了我错误,例如当我调用 add 时,我的 ParseCsv 方法中,将 Bean 添加到列表中。我可以做 public static void writeToCsvFile(String filename, List data) 吗?
  • 什么样的豆子?您可以,但您必须将列表实例化为仅包含 Data 的列表,如下所示: List data = new ArrayList();此列表可能同时具有RecipeDataDemographicData
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多