Elnézést kérek a generikus gyógyszerekkel kapcsolatos korlátozott ismereteimért.
A következő helyzetem van:
1. osztály:
public class PostProcess implements Serializable {
public int order;
// Several other variables.
// Constructor setting vars
public PostProcess(){
}
/* Getters and setters for variables */
}
2. osztály:
public class Application extends PostProcess{
public int subOrder;
// Several other variables.
// Constructor setting vars
public Application(){
}
/* Getters and setters for variables */
}
3. osztály:
public class FileOperation extends PostProcess{
public int subOrder;
// Several other variables (different from class 'Application').
// Constructor setting vars
public FileOperation(){
}
/* Getters and setters for variables */
}
Amit egy másik osztályban próbálok elérni, az az, hogy rendezek egy listát, amely a következőképpen definiált "FileOperation" és "Application" objektumok keverékét tartalmazza:
private ArrayList<? extends PostProcess> processList = new ArrayList<PostProcess>();
Ennek a rendezésnek mindkét objektum két mezőjében kell lennie, nevezetesen: 'order' és 'subOrder'. Az „order” a PostProcess-ből öröklődött, az „alrend” pedig az „Application” és a „FileOperation” osztályban is definiálva van.
A Generics, Comparable, Comparators és Interfaces témájú utam során úgy gondolom, hogy összekevertem a dolgokat.
Megpróbálok egy rendezést alkalmazni a következő használatával:
Collections.sort(processList, new PostProcessComparator());
A PostProcessComparator meghatározása a következő:
public class PostProcessComparator implements Comparator<? extends PostProcess> {
@Override
public int compare(Object p1, Object p2) {
int mainOrderCompare = p1.getOrder().compareTo(p2.getOrder());
if (mainOrderCompare != 0) {
return mainOrderCompare;
} else {
return p1.getSubOrder().compareTo(p2.getSubOrder());
}
}
}
Kérdések:
Tudom, hogy a Comparatorom (és talán több is) hibás, de nem tudom, pontosan hol. Azért vagyok itt, hogy tanuljak ;)
- Észrevettem, hogy a 'processList' List meghatározása nem a megfelelő módszer. Amikor megpróbálok hozzáadni egy 'FileOperation' vagy 'Application' objektumot a listához, a fordító a szemembe vág, hogy "nincs megfelelő metódus az add(Application)"-hez (ugyanez a FileOperation esetében is). Helytelenül feltételeztem, hogy használhatok általánosakat a processList típusaim deklarálásához? helyesnek kell lennie, mivel mindkét osztálynak a PostProcess a szuperosztálya, igaz?
- A PostProcessComparator osztályhatárokkal való definiálása működnie kell a szememben, mivel csak azokat az objektumokat szeretném összehasonlítani, amelyeknek a PostProcess szuperosztálya van (és így ugyanazokhoz a metódusokhoz férnek hozzá).
Hogyan érhetem el az argumentált objektumokat a Comparator osztályban p1 és p2 esetén (mert a típusukat továbbra is deklarálnom kell az argumentumokhoz:
@Override public int compare(<What to put here?> p1, <And here?> p2) { }
Nagyon remélem, hogy tudtok segíteni! Ha valamiben nem lennék világos, szóljon, és rosszul részletezze.
Kösz!
SZERKESZTÉS
NickJ-nek és Winzunak köszönhetően elvégeztem a szükséges változtatásokat a komparátorban és az ArrayList definícióban.
- Áthelyeztem az Alrendet az Application and FileOperationből a szülőosztályba (és védetté tettem őket)
A komparátor újradefiniált paraméterezése:
public class PostProcessComparator<T extends PostProcess> implements Comparator<T>
Az Integer.compare(p1.getOrder(), p2.getOrder())-t használta a kezdeti összehasonlító összehasonlításhoz.
Most az utolsó kihívás (fordítói figyelmeztetések) Híváskor:
Collections.sort(processList, new PostProcessComparator());
Figyelmeztetést kapok: - [nincs bejelölve] nincs bejelölve metódushívás: a Collections osztályban a metódusrendezés az adott típusokra vonatkozik
required: List<T>,Comparator<? super T>
found: ArrayList<PostProcess>,PostProcessComparator
A paraméterezés az én szememben megfelelő ehhez a komparátorhoz, eltekintve attól, hogy nem ellenőriztem az objektumtípusokat.
Hol lehet ez rosszul?