【问题标题】:Java casting a list of <object> to its interfaceJava 将 <object> 列表转换为其接口
【发布时间】:2013-04-15 15:30:16
【问题描述】:

我有:

class Hammer Implements Part {
    public String getName() { return name; }
    public int getId() { return id; }
    ...
}

class Wrench implements Part {
    public String getName() { return name; }
    public int getId() { return id; }
    ...
}

interface Part {
    String getName();
    int getId();
}

我正在使用为 Android SQLite 编写的预构建数据库管理器,它根据我正在检索的内容返回一个对象列表:

dataManager().getWrenchDao().getAll(); // returns List<Wrench>

我无法更改此功能的运作方式。

现在我得到两个列表,例如:

List<Wrench> wrenches = dataManager().getWrenchDao().getAll();
List<Hammer> hammers = dataManager().getHammerDao().getAll();

但是,我想用这些数据填充微调器(微调器是 android 中的下拉列表)。

loadSpinner(Spinner s, List<Part> data) {
    ...
    data.ElementAt(i).getName();
    data.ElementAt(i).getId();
    ...
}

loadSpinner(wrenchSpinner, wrenches);

但它给了我一个铸造错误,您不能将 Wrench 更改为 Part。为什么Java不让我这样做?扳手有 Parts 的所有方法,为什么我不能将它转换成它实现并使用它的东西?

错误:

The method loadSpinner(Spinner, List<Part>) in the type NewActivity is not applicable for the arguments (Spinner, List<Wrench>)

【问题讨论】:

  • 我认为 WrenchDao 应该返回 List
  • 你能粘贴实际的错误吗?我认为这是在抱怨您不能将List&lt;Wrench&gt; 转换为List&lt;Part&gt;,而不是您不能将Wrench 转换为Part...?
  • 如果 Part 不是接口,而是将其设为父类,然后让 Wrench 和 Hammer 扩展 Part,该怎么办。您甚至可以将 getName() 和 getId() 抽象化,以便 Wrench 和 Hammer 必须实现这些方法。
  • 我希望我可以改变它,但我使用的是预构建的 jar 数据管理器插件。 @EdwardThomson 用错误更新我的问题。

标签: java generics inheritance interface casting


【解决方案1】:

您必须将loadSpinner的第二个参数替换为:

loadSpinner(Spinner s, List<? extends Part> data)

另请参阅:When do Java generics require <? extends T> instead of <T> and is there any downside of switching?

【讨论】:

  • 正是我需要的。还必须添加一个默认构造函数。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多