Proszę rozważyć następujący fragment:Jak mogę rzucić listę używając generycznych w Javie?
public interface MyInterface {
public int getId();
}
public class MyPojo implements MyInterface {
private int id;
public MyPojo(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
public ArrayList<MyInterface> getMyInterfaces() {
ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0);
myPojos.add(new MyPojo(0));
myPojos.add(new MyPojo(1));
return (ArrayList<MyInterface>) myPojos;
}
Instrukcja return robi casting że nie kompiluje. Jak mogę przekonwertować listę myPojos na bardziej ogólną listę, , bez konieczności przechodzenia przez każdą pozycję z listy?
Dzięki
Drugie rozwiązanie to lepsze jedno IMHO. Zwracanie dzikich kart jest ogólnie uważane za złą praktykę, b/c ogranicza kod klienta. W tym przypadku z ArrayList rozszerza MyInterface> mogłeś tylko czytać z listy i nie mógł nic dodać. –
Oczywiście może być to, o co nam chodzi - po prostu nie wiemy. (Należy używać prawie na pewno Lista zamiast ArrayList , jak również, a może po prostu iterowalny lub Collection .) –
+1 za korzystanie rodzaje bardziej ogólnych (np Lista, kolekcja ). Ale powracających symboli wieloznacznych rzadko jest to, co chcesz. Jeśli jesteś skłonny do niezmienności, istnieją lepsze sposoby robienia tego. Naftalin & Wadler opowiadają o tym w "Java Generics and Collections". –