2012-11-01 12 views
5

Próbuję zmodyfikować klasę AuthenticatedUser, aby zapisać listę AdminRole. AuthenticatedUser to klasa używana przez wszystkie moje aplikacje; zostanie wprowadzony do sesji, gdy użytkownik zaloguje się pomyślnie. Teraz chcę dodać listę ról autoryzacji do sesji użytkownika. Jednak każda aplikacja definiuje nieco inną klasę: AdminRole. Na przykład, moje bazy DataCenter Aplikacja przechowuje w bazie danych:Java Klasa abstrakcyjna i generics

employee_id 
    role_name 
    site_name 
    receive_email 

Nie wszystkie moje aplikacje będą musiały pole receive_email lub może chcieć przedłużyć własne metody. Pomyślałem, że to wymaga klasy abstrakcyjnej. Ale Eclipse narzeka na niewłaściwy typ w ustawieniu Authorized_role_list tutaj w tym fragmencie.

DataCenterAdminRoleDAO dcAdminDao = new DataCenterAdminRoleDAO(); 
    try { 
     List<DataCenterAdminRole> authorized_roles = dcAdminDao.getAuthorizedRoleListByBadge(authenticatedUser.getBadge()); 
     authenticatedUser.setAuthorized_role_list(authorized_roles); 

=== Classes 

public class AuthenticatedUser extends Employee implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private List<AdminRole> authorized_role_list; 
    ... 
} 

public abstract class AdminRole implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private String role_name; //regular, admin, editor, etc.. 
    private String site_id; //company branches 
    ... 
} 

public class DataCenterAdminRole extends AdminRole implements Serializable { 

Oczywiście poprawka jest powrót listę AdminRole w moim Datacenter implementacja ale myślałem, poprzez rozszerzenie klasy abstrakcyjnej mogę przekazać podklasy. czego mi brakuje?

+0

Spróbuj utworzyć [sscce] (krótki, własny, poprawny przykład). Rozumiem, że masz błąd kompilacji, ale możesz skomentować ten wiersz. Wklej również rzeczywisty błąd zgłoszony przez Eclipse bez przeprogramowywania. –

Odpowiedz

2

Jeśli jest to seter, który daje masz kłopoty można użyć dolny asterisk na authorized_roles_list

private List<? extends AdminRole> authorized_role_list; 
.... 
public setAuthorized_role_list(List<? extends AdminRole> authorized_roles) { 
... 
} 
2

Generics nie zachowują się jak reszta Java. Automatyczne odlewanie nie występuje, więc jeśli metoda wymaga List<List>, nie możesz jej przekazać List<ArrayList>. Podobnie tutaj, jeśli twój seter poprosił o listę, nie możesz jej podać jako List<? extends AdminRole>, chyba że zdefiniujesz ją jako List<? extends AdminRole>. Można jednak przesłonić metody setter wziąć List<DataCenterAdminRole> jeśli chcesz, lub konwertować List<DataCenterAdminRole> do List<AdminRole>, lub po prostu zmienić Ustawiacz/pole za rodzaj uchwycić <? extends AdminRole>

1

a List<Orange> nie jest List<Fruit>, nawet jeśli Orange jest owocem. Jeśli było to List<Fruit>, można wykonać następujące czynności:

List<Orange> orangeList = new ArrayList<Orange>(); 
List<Fruit> fruitList = orangeList; 
fruitList.add(new Apple()); 

I byłoby zatem całkowicie przerwać typu bezpieczeństwa kolekcji generycznych, ponieważ lista będzie zawierać pomarańczy jabłko. UwierzytelnionyUżytkownik powinien zawierać List<? extends AdminRole>, aby móc robić to, co robisz.

+0

Aby lepiej zrozumieć twoją analogię, zakodowałem to w Eclipse. Dostaję błąd na linii nr 2. Eclipse sugeruje zmianę rodzaju owocówLista na listę . Sądzę, że właśnie to podkreślasz, że Eclipse uniemożliwia mi złamanie bezpieczeństwa typu. – jeff

+0

Tak, masz to. –

Powiązane problemy