mam:Java odlewania listę <object> do jego interfejs
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();
}
Używam prekompilowany menedżera bazy danych napisane dla Androida SQLite, który zwraca listę obiektów w oparciu o to, co mam pobierania:
dataManager().getWrenchDao().getAll(); // returns List<Wrench>
Nie mogę zmienić działania tej funkcji.
Teraz jestem coraz zarówno list jak:
List<Wrench> wrenches = dataManager().getWrenchDao().getAll();
List<Hammer> hammers = dataManager().getHammerDao().getAll();
Jednakże chcę, aby wypełnić błystki z tymi danymi (Spinners są rozwijane listy w Android).
loadSpinner(Spinner s, List<Part> data) {
...
data.ElementAt(i).getName();
data.ElementAt(i).getId();
...
}
loadSpinner(wrenchSpinner, wrenches);
Ale to daje mi błąd w rzucaniu, że nie można zmienić klucza na części. Dlaczego Java nie pozwala mi tego zrobić? Wrenches mają wszystkie metody, które robią Części, więc dlaczego nie mogę rzucić go w coś, co implementuje i używa?
Błąd:
The method loadSpinner(Spinner, List<Part>) in the type NewActivity is not applicable for the arguments (Spinner, List<Wrench>)
myślę że WrenchDao powinny List –
user2147970
Czy możesz wkleić rzeczywisty błąd? Myślę, że to narzeka, że nie możesz rzucić 'List' na 'List ', nie że nie możesz rzucić 'Wrench' na' Part' ...? –
Co, jeśli zamiast części jest interfejsem, stajesz się klasą nadrzędną, a następnie masz możliwość rozszerzenia części przez Wrench and Hammer. Można nawet utworzyć streszczenie getName() i getId() tak, aby Wrench and Hammer musiał implementować te metody. – RyPope