Java将<object>列表转换为其接口

use*_*440 5 java generics inheritance casting interface

我有:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

dataManager().getWrenchDao().getAll(); // returns List<Wrench>
Run Code Online (Sandbox Code Playgroud)

我无法改变这个功能的运作方式.

现在我得到两个列表:

List<Wrench> wrenches = dataManager().getWrenchDao().getAll();
List<Hammer> hammers = dataManager().getHammerDao().getAll();
Run Code Online (Sandbox Code Playgroud)

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

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

loadSpinner(wrenchSpinner, wrenches);
Run Code Online (Sandbox Code Playgroud)

但它给了我一个铸造错误,你无法改变扳手到零件.为什么Java不允许我这样做?扳手有所有方法,部件这样做,为什么我不能把它投入它实现和使用它的东西?

错误:

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

小智 14

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

loadSpinner(Spinner s, List<? extends Part> data)
Run Code Online (Sandbox Code Playgroud)

另请参阅:Java泛型何时需要<?扩展T>而不是<T>并且是否存在切换的缺点?