Witam!
Jeśli moje pytanie jest na tyle żałosne, że kwalifikuje się pod Newbie, a nie Java, to bardzo proszę o przeniesienie :P Mam nadzieję, że nie duplikuję wątku.
Do rzeczy! Mam sobie klasę DatabaseManager, której zadaniem jest zapisywanie i odczytywanie encji do/z bazy danych. Ma ona metodę, która zwraca obiekt dziedziczący po AbstractClientModel (na dany moment jest to albo IndividualClientModel albo BusinessClientModel). Zaraz po wyciągnięciu danych do zmiennej, zmienna client jest typu BusinessClientModel (co się zgadza z danym wpisem w bazie danych). Teraz w Mainie chciałbym sobie przypisać obiekt zwracany przez wcześniej opisaną metodę do zmiennej.
I tu moje pytanie: jak zadeklarować tą zmienną, żebym mógł używać w pełni możliwości obiektu, do którego ona posiada referencję? Czy jest możliwość "wiedzieć" jakiego typu dany obiekt będzie, żeby zadeklarować zmienną takiego samego typu?
Jeśli zadeklaruję zmienną typu AbstractClientModel, to dostaję błąd przy wywołaniu metody z klasy BusinessClientModel, lecz jeśli zmienna będzie typu BusinessClientModel, to (zgodnie z oczekiwaniami) wszystko ładnie działa. Lecz nie zawsze będę wiedział jakiego dokładnie typu jest zwrócony obiekt. W danej sytuacji (2 klasy dziedziczące) mogę zrobić ifa z instanceof, ale jeśli będzie więcej klas dziedziczących, to lipa. Z genericsami dopiero zaczynam, więc oczywiście konstruktywna krytyka mile widziana.
A teraz czas na to co wszyscy lubią, czyli trochę kodu :D
Metoda z klasy DatabaseManager
public < T extends AbstractClientModel> T getClientByIndex(long index) {
entityManager.getTransaction().begin();
T client = (T) entityManager.find(AbstractClientModel.class, index);
entityManager.getTransaction().commit();
return client;
}
Przypisanie w mainie
BusinessClientModel client = databaseManager.getClientByIndex(3L);
Shalom