我有:
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();
但是,我想用这些数据填充微调器(Spinners是android中的下拉列表)。
loadSpinner(Spinner s, List<Part> data) {
...
data.ElementAt(i).getName();
data.ElementAt(i).getId();
...
}
loadSpinner(wrenchSpinner, wrenches);
但它给了我一个投射错误,你无法改变扳手到零件。为什么Java不允许我这样做?扳手有各种方法,部件这样做,为什么我不能把它投入到它实现和使用它的东西?
错误:
The method loadSpinner(Spinner, List<Part>) in the type NewActivity is not applicable for the arguments (Spinner, List<Wrench>)
答案 0 :(得分:14)
您必须将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?