2012-11-01 156 views
5

我試圖修改一個類AuthenticatedUser來存儲AdminRole的列表。 AuthenticatedUser是我所有應用程序使用的類;它會在用戶成功登錄時進入會話。現在我想將授權角色列表添加到用戶會話中。然而,每個應用程序定義一個AdminRole類有點不同。例如,在數據庫中的數據中心我的應用程序商店:Java抽象類和泛型

employee_id 
    role_name 
    site_name 
    receive_email 

並非所有的我的應用程序將需要receive_email場或可能要擴展自己的方法。我認爲這是一個抽象類。但是Eclipse在這段代碼中抱怨Authorized_role_list設置器的Type錯誤。

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 { 

顯然,一個解決辦法是在我的數據中心implemetation返回AdminRole清單,但我想通過擴展抽象類,我可以通過子類。我錯過了什麼?

+0

請嘗試創建一個[sscce](簡短,自包含,正確示例)。我意識到你有編譯錯誤,但你可以留下那條評論。同時粘貼由Eclipse報告的實際錯誤,而不進行修改。 –

回答

2

如果它被賦予的setter你麻煩,你可以用一個下界使用通配符在authorized_roles_list

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

泛型不像Java的其他部分。自動鑄造不會發生,所以如果方法要求List<List>,則不能將其交給List<ArrayList>。同樣在這裏,如果你的接球員要求名單,你不能把它交給List<? extends AdminRole>,除非你把它定義爲List<? extends AdminRole>。你可以,但是,覆蓋setter方法採取List<DataCenterAdminRole>,如果你想,或者將您List<DataCenterAdminRole>List<AdminRole>,或者只是改變你的二傳手/領域是一個捕獲型<? extends AdminRole>

1

一個List<Orange>不是List<Fruit>,即使橙是一種水果。如果這是一個List<Fruit>,你可以做到以下幾點:

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

而且,它還將從而徹底打破泛型集合類型安全,因爲橘子的列表將包含一個蘋果。 AuthenticatedUser應該包含一個List<? extends AdminRole>以便能夠做你正在做的事情。

+0

爲了更好地理解你的類比,我在Eclipse中對此進行了編碼。我在#2行發生錯誤。 Eclipse建議將fruitList的類型更改爲列表。我想這就是你指出的,Eclipse阻止了我打破類型安全。 – jeff

+0

是的,你明白了。 –