5

我正在尝试修改一个类AuthenticatedUser以存储AdminRole's 列表。 AuthenticatedUser是我所有应用程序都使用的类;当用户成功登录时,它会被放入会话中。现在我想向用户会话添加授权角色列表。然而,每个应用程序对AdminRole类的定义略有不同。例如,我的 DataCenter 应用程序存储在数据库中:

  employee_id
  role_name
  site_name
  receive_email

并非我的所有应用程序都需要 receive_email 字段,或者可能想要扩展自己的方法。我认为这需要一个抽象类。但是 Eclipse 在此代码段中抱怨 Authorized_role_list 设置器上的错误类型。

  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但我认为通过扩展抽象类我可以传递子类。我错过了什么?

4

3 回答 3

2

泛型的行为与 Java 的其他部分不同。不会发生自动转换,所以如果一个方法需要List<List>,你不能把它交给List<ArrayList>. 同样,如果您的 setter 调用 List,则不能将其交给List<? extends AdminRole>,除非您将其定义为List<? extends AdminRole>。但是,您可以根据需要覆盖 setter 方法以采用 a List<DataCenterAdminRole>,或者将您的方法转换List<DataCenterAdminRole>为 a List<AdminRole>,或者只是将您的 setter / 字段更改为捕获类型<? extends AdminRole>

于 2012-11-01T23:03:44.297 回答
2

如果是设置器给您带来麻烦,您可以使用带有通配符的下限authorized_roles_list

private List<? extends AdminRole> authorized_role_list;
....
public setAuthorized_role_list(List<? extends AdminRole> authorized_roles) {
...
}
于 2012-11-01T23:04:04.650 回答
1

AList<Orange>不是 a List<Fruit>,即使 Orange 是 Fruit。如果是List<Fruit>,您可以执行以下操作:

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

因此它会完全破坏泛型集合的类型安全,因为一个橘子列表会包含一个苹果。AuthenticatedUser 应该包含一个List<? extends AdminRole>能够做你正在做的事情。

于 2012-11-01T23:06:36.087 回答