Aktywne Wpisy

ogurkiszony75 +131
ᕙ(⇀‸↼‶)ᕗ
źródło: temp_file8278001896909241751
Pobierz
Umeraczyk +371
Zostaje kanapka z "piekarni", tosty w KFC i St*rbucks
źródło: temp_file1379832231415700892
PobierzSkopiuj link
Skopiuj link
źródło: temp_file8278001896909241751
Pobierz
źródło: temp_file1379832231415700892
PobierzRegulamin
Reklama
Kontakt
O nas
FAQ
Osiągnięcia
Ranking
Koledzy, może ktoś mi to wytłumaczy lub podeśle mi materiały aby dobrze zrozumieć ale ten konkretny przypadek. Chodzi o generyki.
Mam klasę abstrakcyjną:
public abstract class BaseManager >{
//z polem którego potrzebuje
protected D dao;
//tu inne metody nieważne
}
I teraz chodzi o inicjalizację pola "dao" w metodach dzieciczących z tej klasy:
public class MyManager extends BaseManager {
//próbuje tak ale nie mogę!!!:
dao = new ItemDAO;
//tak mogę ale defakto nie korzystam z informacji z generyka
ItemDAO dao = new ItemDAO();
//W necie w przykładzie przez konstruktor działa, Dlaczego?.
public ItemManager(){
dao = new ItemDAO();
}
}
Czemu tylko w konstruktorze mogę zrobić dao = new ItemDAO() czyli korzysta z informacji z generyka, że pole dao będzie danego typu? A normalnie w klasie już nie?
dao = new ItemDAO; to przypisanie, czyli kod, a kod może być tylko w metodach. Konstruktor jest metodą.
ItemDAO dao = new ItemDAO(); to deklaracja nowego pola. Stare pole BaseManager::dao pozostaje niezainicjalizowane. Nawet jeśli kompilator to przepuścił (powinien być jakiś warning, ale nie wiem czy jest), to duża szansa, że kod będzie działać źle, bo będzie się odnosić do różnych pól.
@vytah: Dzięki vytah, w sumie takie oczywiste ale zamiast rozłożyć sobie to na czynniki pierwsze to łączyłem to z generykami i się zamotałem. Taki sobie przykład zrobiłem (bez generyków) i wszystko oczywiste :-)
public class Test