2010-07-22 6 views
1

J'ai la liste d'utilisateurs suivante. StudentBean et ProfessorBean sont les sous-types de UsersBean.Java Generics Question

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

Ici, je veux imprimer l'information de professorbean OU les informations de StudentBeans. Existe-t-il un moyen d'obtenir des méthodes de professeur ou de bean étudiant sans distribution explicite?

Répondre

2

Si la méthode est commune et déclarée dans la classe de base ou l'interface (UsersBean), oui. Sinon - non, vous devez lancer. Pas de dactylographie en Java.

2

Vous devez déclarer les méthodes auxquelles vous souhaitez accéder dans la classe/interface UserBean. Par exemple, si UserBean est une interface que vous auriez: me

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

Il semble à c'est une odeur de mauvaise conception.

Vous avez une référence à l'utilisateur alors vous êtes supposé "travailler sur" l'utilisateur.

Et, il n'y a rien à voir avec « Génériques »

0

Non, ce n'est pas possible. Vous devez convertir l'objet UserBean en StudentBean ou en ProfessorBean si votre collection nécessite l'accès aux méthodes du bean.

Des méthodes communes peuvent être déclarées en tant que getters/setters abstraits dans le bean UserInfo pour éviter la conversion.

Une alternative pourrait être la méthode surcharge getUser pour permettre le filtrage comme ceci:

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

Cette méthode serait tout simplement renvoyer les utilisateurs qui sont Profs (dans cet exemple). Cela nécessiterait toujours le cast, mais le casting serait 'caché' dans la méthode getUser.