2012-11-01 5 views
5

Sto tentando di modificare una classe AuthenticatedUser per memorizzare un elenco di AdminRole. AuthenticatedUser è una classe utilizzata da tutte le mie applicazioni; viene inserito in una sessione quando l'utente si collega correttamente. Ora voglio aggiungere un elenco di ruoli di autorizzazione alla sessione utente. Tuttavia, ciascuna applicazione definisce la classe AdminRole in modo leggermente diverso. Ad esempio, i miei negozi di applicazioni DataCenter nel database:Java Abstract Class And Generics

employee_id 
    role_name 
    site_name 
    receive_email 

Non tutti i miei applicazioni dovranno campo receive_email o possono voler estendere i propri metodi. Ho pensato che questo richiedesse una lezione astratta. Ma Eclipse si lamenta del tipo sbagliato nel setter Authorized_role_list qui in questo frammento.

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 { 

Ovviamente una correzione è quello di restituire un elenco di AdminRole nel mio Datacenter Implementazione ma ho pensato estendendo la classe astratta ho potuto passare la sottoclasse. Cosa mi manca?

+0

Si prega di provare a creare [sscce] (breve, autonomo, esempio corretto). Mi rendo conto che hai un errore di compilazione ma puoi lasciare la linea commentata. Incollare anche l'errore effettivo segnalato da Eclipse senza riformulare. –

risposta

2

Se è il setter che sta dando si guai è possibile utilizzare un limite inferiore con un carattere jolly sul authorized_roles_list

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

I generici non si comportano come il resto di Java. Il lancio automatico non si verifica, quindi se un metodo richiede List<List>, non puoi consegnarlo a List<ArrayList>. Allo stesso modo, se il tuo setter ha chiamato List, non puoi consegnarlo a List<? extends AdminRole>, a meno che non lo definisci come List<? extends AdminRole>. È possibile, tuttavia, eseguire l'override del metodo setter di prendere una List<DataCenterAdminRole>, se si desidera, o convertire il vostro List<DataCenterAdminRole> a un List<AdminRole>, o semplicemente modificare il setter/il campo per essere un tipo di acquisizione <? extends AdminRole>

1

un List<Orange> non è un List<Fruit>, anche se Orange è un frutto. Se fosse un List<Fruit>, si potrebbe fare la seguente:

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

e sarebbe quindi rompere completamente il tipo di sicurezza di collezioni generici, dal momento che un elenco di arance conterrebbe una mela. L'AuthenticatedUser dovrebbe contenere un List<? extends AdminRole> per poter fare ciò che stai facendo.

+0

Per capire meglio la tua analogia, l'ho codificato in Eclipse. Ottengo un errore sulla linea # 2. Eclipse suggerisce di modificare il tipo di elenco di frutta nell'elenco . Immagino sia questo ciò che stai sottolineando, che Eclipse mi impedisce di rompere la sicurezza del tipo. – jeff

+0

Sì, ce l'hai. –