• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Typ genereyczne. Dlaczego on chce Object a nie object EntityManager.

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 10 grudnia 2017 w Java przez ShiroUmizake Nałogowiec (46,300 p.)

Buduje sobie serwis EmployeeManagerService, jedną z składowych tego serwisu jest HibernateSetup (bym do testów mógł użyć bazy hsqlDB, a do odpalania systemy mysqlDB, a przyszłości łatwy sposób podłączyć inne rodzaje persistance unit)

By ułatwić sobie pracę budowaniem klas setup stworzyłem sobie interfejs

public interface iHibernateSetup <T> {
    void createPU();
    Object getEm();
}

Tam gdzie jest Object wcześniej był typ T. Chwilowo to rozwiązałem, dynamicznym castowaniem na typ. Ale jeszcze tego rozwiązania nie sprawdzałem. Zakładam 3 rozwiązania: zadziała, ale będzie muliło (to nie jest prosty obiekt domenowy), nie zadziała, JVM nie będzie w stanie tego rozwiązać. 3: Memory leak.

Narazie załóżmy, że jest tam typ generyczny.

Intefejs implementuje dla przykładu hsqlDBSetup

public class hsqlDBSetup implements iHibernateSetup<EntityManager> {
    private EntityManager em;

    public void  createPU() {
        em = Persistence.createEntityManagerFactory("testPU").createEntityManager();
    }

    public Object getEm(){
        return em;
    }

}

Normalnie tam gdzie jest Object jest EntityManager.

No i mam klase setupManager.

 

public class SetupManager {
    public EntityManager getEm(HibernateProperties.typePU hibernateTypePU){
        switch(hibernateTypePU){
            case hsqlDBPU:{
               iHibernateSetup setup =  new hsqlDBSetup();
               setup.createPU();
               return (EntityManager) setup.getEm();
            }
            case mysqlDBPU:{
                return new MysqlSetup();
            }
            default:{
                throw new EnumConstantNotPresentException(HibernateProperties.typePU.class, "Not found type hibernateSetup");
            }
        }
    }
}

I tu przy setupManager w switch na zwrocie castuje pod konkretny typ obiektu. Bez castowania, debug krzyczał że required to EntityManager a dostaje Object, choć w getEm() jasno jest zaznaczone że typ to EntityManager. 

Pytanie czy ktos wie jak to rozwiązać. Wcześniej nie bawiłem (powiedzmy świadomie) typami generycznymi.

No i jeszcze wyjście pokaże.

public class ManagerEmployeeService {
    private SetupManager setupManager = new SetupManager();
    private EntityManager em;
    public ManagerEmployeeService (HibernateProperties.typePU typePU){
        em = setupManager.getEm(typePU);
    }
}

 

1 odpowiedź

0 głosów
odpowiedź 10 grudnia 2017 przez Tomasz90 Nałogowiec (25,140 p.)
No ale jak masz interfejs generyczny to jego metoda powinna zwracać typ generyczny a nie Object. Bo jak zwracasz Object to wtedy rzutujesz w dół hierarchii i wtedy jawnie musisz zrzutować na tego EntityManagera.
komentarz 10 grudnia 2017 przez ShiroUmizake Nałogowiec (46,300 p.)

Jak zmieniłem na entityManager krzyczał to SetupManager krzeczyał, że oczekiwał entiyManager a dostał Object. 

By powiększyć zagadkę to tutaj na przykład nie krzyczy:

public class FactoryDAOImpl implements iFactoryDAO {

    Repository productDAO;
    @Override
    public Repository getProduct() {
        return productDAO;
    }

    @Override
    public void buildProduct(DAOProperties.Type typeDAO) {
        switch (typeDAO) {
            case AddressDAO: {
                productDAO = new AddressDAO();
                break;
            }
            case BeforeEmployersDAO: {
                productDAO = new BeforeEmployersDAO();
                break;
            }
            case BonusDAO: {
                productDAO = new BonusDAO();
                break;
            }
            case ContractDAO: {
                productDAO = new ContractDAO();
                break;
            }
            case CourseDAO: {
                productDAO = new CourseDAO();
                break;
            }
            case EducationDAO: {
                productDAO = new EducationDAO();
                break;
            }
            case PersonDAO: {
                productDAO = new PersonDAO();
                break;
            }
            case PersonInformationDAO: {
                productDAO = new PersonInformationDAO();
                break;
            }
            case RaportOfWorkDAO: {
                productDAO = new RaportOfWorkDAO();
                break;
            }
            default: {
                throw new EnumConstantNotPresentException(DAOProperties.Type.class, "Not found typeDAO");
            }
        }
    }

}

Przykładowe DAO:

public class BonusDAO implements Repository<Bonus> {

    @Override
    public void create(Bonus entity) {

    }

    @Override
    public void remove(Bonus entity) {

    }

    @Override
    public void update(Bonus entity, int id) {

    }

    @Override
    public Bonus findWithId(int id) {
        return null;
    }

    @Override
    public void delete(int id) {

    }

    @Override
    public void setEm(EntityManager em) {
        
    }
}

 

komentarz 11 grudnia 2017 przez Tomasz90 Nałogowiec (25,140 p.)

Ja miałem na myśli, że zamiast:

Object getEm();

powinno być:

T getEm();

a u Ciebie w tej chwili jest tak, że metoda getEM() zwraca Object z którego rzutujesz na EntityManager (rzutowanie w dół, więc musi być jawne)

W tym co wrzuciłeś wyżej to jest tak, że zwracasz każde DAO jest typu Repository<T> więc nie ma błędu kompilacji (rzutowanie w górę, które nie musi być jawne)

komentarz 12 grudnia 2017 przez ShiroUmizake Nałogowiec (46,300 p.)
Dam Ci dzis znać jak podmienie Czy setup dalej się pruje opis  typ.

Narazie testy przechodza.

Podobne pytania

0 głosów
1 odpowiedź 384 wizyt
pytanie zadane 12 lutego 2020 w Java przez Fortitudo Nowicjusz (160 p.)
0 głosów
1 odpowiedź 392 wizyt
pytanie zadane 9 czerwca 2018 w Java przez trebuhhh Użytkownik (740 p.)
0 głosów
3 odpowiedzi 513 wizyt
pytanie zadane 21 maja 2018 w Java przez Paweł Hozer Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...