Witajcie,
Mam problem i niezbyt wiem, jak go w ogole ugryzc (czyt. czemu sie pojawia):
-
mam program, ktory laduje z plikow JAR klasy, ktore implementuja (na pewno) interfejs Bazowy (najczesciej nie jest to bezposrednie implementowanie tegoz interfejsu, tylko implementowanie go poprzez implementowanie w klasie interfejsu dziedziczacego po Bazowy)
-
mam kolekcje, w ktorej trzymam pary: nazwa (kanoniczna) interfejsu implementowanego przez dynamicznie zaladowana klase (interfejs ten na pewno dziedziczy po Bazowy) + klasa, ktora implementuje interfejs, ktorego nazwa jest kluczem
-
zaladowane klasy pobieraja z tej kolekcji klasy, ktore implementuja potrzebne im interfejsy (dziedziczace oczywiscie po Bazowy)
no i teraz jest problem...
/* Dziedziczacy extends Bazowy */
Dziedziczacy d = (Dziedziczacy) pobierzZKolekcji(Dziedziczacy.class.getCanonicalName());
// to powyzej powoduje wystapienie wyjatku ClassCastException mowiacego o tym, ze nie mozna zrzutowac klasy, ktora jest zwracana z kolekcji (ktora na 100 % implementuje interfejs Dziedziczacy) na Dziedziczacy
// dodam, ze Dziedziczacy nie jest jakos "specjalnie" ladowany z pliku .jar - uznalem, ze chyba jest automatycznie ladowany, jesli klasa ladowana do programu go wymaga...
// Bazowy jest w zrodlach "wspolnych" dla aplikacji glownej oraz klas ladowanych potem dynamicznie i takie cos dziala:
Bazowy b = (Bazowy) pobierzZKolekcji(Dziedziczacy.class.getCanonicalName());
// oczywiscie ta metoda zwraca Bazowy, jako, ze jest to wspolny interfejs, ktory implementuja wszystkie dynamicznie ladowane klasy
Mam nadzieje, ze zrozumiecie o co mi chodzi ;)
//edit: prawdopodobna przyczyna bledu podana w kolejnym poscie.