2010-07-22 5 views
1

다음 사용자 목록이 있습니다. StudentBean과 ProfessorBean은 UsersBean의 부속 유형입니다.Java Generics 질문

List<? extends UsersBean> users = this.getUsers(locationId); 
for(UsersBean vo :users) { System.out.println("Name : "); } 

나는 professorbean의 정보 또는 StudentBeans의 정보를 인쇄하려고합니다. 명시 적 캐스트없이 교수 또는 학생 콩 메서드를 가져올 수있는 방법이 있습니까?

답변

2

메서드가 공통적이며 기본 클래스 또는 인터페이스 (UsersBean)로 선언 된 경우 예입니다. 그렇지 않으면 - 아니, 당신은 캐스팅해야합니다. Java에서 오리 입력이 없습니다.

2

UserBean 클래스/인터페이스에서 액세스 할 메소드를 선언해야합니다.

그것은 내게 그에게 소리
public interface UserBean { 
    public String getInfo(); 
} 

class StudentBean implements UserBean { 
    public String getInfo() { 
     return "student info"; 
    } 
} 

class ProfessorBean implements UserBean { 
    public String getInfo() { 
     return "professor info"; 
    } 
} 
0

나쁜 디자인의 냄새 예를 들어 UserBean 경우 것이다 인터페이스입니다.

사용자에 대한 참조가있는 경우 사용자에 대해 "작업"한다고 가정합니다.

는, "제네릭"아니, 그건 불가능

0

와는 아무 상관 없다. Bean 메소드에 액세스해야하는 콜렉션 인 경우, UserBean 오브젝트를 StudentBean 또는 ProfessorBean으로 캐스트해야합니다.

일반적인 메소드는 캐스팅을 피하기 위해 UserInfo bean에서 abstract getters/setters로 선언 될 수 있습니다.

대안은 다음과 같이 필터링 허용하는 방법 인 getUser 과부하 될 수있다 :

List<ProfessorBean> professors = this.getUser(locationId, ProfessorBean.class); 

그 방법은 단지 (이 예에서) PROFS있는 사용자를 반환. 여전히 캐스팅이 필요하지만 캐스팅은 getUser 메소드에서 '숨김'됩니다.