Wpis z mikrobloga

#naukaprogramowania #java
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?
  • 3
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Equalizer:
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.
  • Odpowiedz
czyli kod, a kod może być tylko w metodach


@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
  • Odpowiedz