2012-11-01 157 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

是的,你明白了。 –