簡體   English   中英

Java抽象類和泛型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM