[英]Java Abstract Class And Generics
我試圖修改一個類AuthenticatedUser
來存儲AdminRole
的列表。 AuthenticatedUser
是我所有應用程序使用的類; 用戶成功登錄后,它將進入會話。 現在,我想向用戶會話添加授權角色列表。 但是,每個應用程序對AdminRole
類的定義AdminRole
一些不同。 例如,我的DataCenter應用程序存儲在數據庫中:
employee_id
role_name
site_name
receive_email
並不是我所有的應用程序都需要receive_email字段,或者可能想擴展自己的方法。 我認為這需要一個抽象類。 但是Eclipse在此代碼段中抱怨Authorized_role_list setter上的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 {
顯然,一種解決方法是在我的數據中心實現中返回AdminRole
的列表,但是我認為通過擴展抽象類,我可以傳遞子類。 我想念什么?
泛型的行為不像Java的其余部分。 自動轉換不會發生,因此,如果方法調用List<List>
,則無法將其交給List<ArrayList>
。 同樣在這里,如果您的設置員要求使用List,則不能將其交給List<? extends AdminRole>
List<? extends AdminRole>
,除非您將其定義為List<? extends AdminRole>
List<? extends AdminRole>
。 但是,可以根據需要重寫setter方法以獲取List<DataCenterAdminRole>
,或將List<DataCenterAdminRole>
轉換為List<AdminRole>
,或僅將setter /字段更改為捕獲類型<? extends AdminRole>
<? extends AdminRole>
如果是給您帶來麻煩的二傳手,則可以在authorized_roles_list
上使用帶通配符的下限
private List<? extends AdminRole> authorized_role_list;
....
public setAuthorized_role_list(List<? extends AdminRole> authorized_roles) {
...
}
即使Orange是水果, List<Orange>
也不是List<Fruit>
。 如果它是List<Fruit>
,則可以執行以下操作:
List<Orange> orangeList = new ArrayList<Orange>();
List<Fruit> fruitList = orangeList;
fruitList.add(new Apple());
因此,這將完全破壞通用集合的類型安全性,因為一個橘子列表將包含一個蘋果。 AuthenticatedUser應該包含一個List<? extends AdminRole>
List<? extends AdminRole>
以能夠執行您正在做的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.