2012-11-01 4 views
5

AdminRole 님의 목록을 저장하려면 AuthenticatedUser 클래스를 수정하려고합니다. AuthenticatedUser은 내 모든 응용 프로그램에서 사용하는 클래스입니다. 사용자가 성공적으로 로그인하면 세션에 들어갑니다. 이제 사용자 세션에 권한 부여 역할 목록을 추가하려고합니다. 그러나 각 응용 프로그램은 AdminRole 클래스를 약간 다르게 정의합니다. 예를 들어, 데이터베이스 내 데이터 센터 응용 프로그램을 저장 :Java 추상 클래스 및 제네릭

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의 목록을 반환하는 것입니다하지만 난 추상 클래스 나 서브 클래스를 전달할 수를 확장하여 생각했다. 내가 뭘 놓치고 있니?

+0

[짧음, 자체 포함, 올바른 예]를 만들어보세요. 컴파일 오류가 있다는 것을 알았지 만 해당 행을 주석으로 남겨 둘 수 있습니다. 또한 리팩토링하지 않고 Eclipse에서보고 한 실제 오류를 붙여 넣으십시오. –

답변

2

을 할 수 이 문제는 authorized_roles_list

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

제네릭은 나머지 자바처럼 동작하지 않습니다. 자동 캐스팅 업이 발생하지 않으므로 List<List> 메서드가 호출되면 List<ArrayList>을 넘길 수 없습니다. 마찬가지로 setter가 List를 호출하면 List<? extends AdminRole>으로 정의하지 않는 한 List<? extends AdminRole>을 넘길 수 없습니다. 그것은주고있다 세터 있다면 당신은, 그러나, 당신이 원하는 경우 List<DataCenterAdminRole>를 취할 세터 메소드를 오버라이드 (override), 또는 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 번 줄에 오류가 있습니다. 이클립스는 과일 목록을 바꿀 유형을 제안한다.리스트는 이다. 나는 이것이 당신이 지적한 것, 이클립스가 타입 안전을 깨지 못하게한다고 생각합니다. – jeff

+0

예, 알았습니다. –

관련 문제