2016-11-14 1 views
0

Il existe un Set<Trump> qui est passé à une autre fonction qui prend en argument un Set<? extends Politician>. Étant donné que Set<? extends Politician> va contenir soit un objet Politician ou un objet Trump seulement. Les classes Politican ne peuvent pas être modifiées. La classe Trump est disponible pour modification.Récupérer un sous-type à partir d'un <? extends Animal>

Existe-t-il un moyen de faire proprement ce qui suit, ou comment la classe dérivée (Trump) doit-elle être remaniée pour être capable de faire ceci?

public Set<Trump> getSetOfTrump(Set<? extends Politician> politicianSet) 
{ 
    //do some processing 
    for(Politician pol : politicianSet){ //compiler is ok.. but I dont need Politician Object here 
    } 

    for(Trump t : politicianSet){ // any way to get Trump Objects out of politicianSet? 
    } 

} 
+0

sans utiliser 'instanceof' ou de réflexion? – bradimus

+1

L'utilisation de 'instanceof' peut être une preuve de l'odeur du code .. mais ... si vous n'avez pas accès au code pour le supertype, alors il peut être l'option la meilleure, la plus rapide et la moins chère pour opérer sur des instances de sous-type type. – scottb

+0

@bradimus .. oui .. Pour le faire sans réflexion ou instanceof .. son ok pour re-concevoir la classe dérivée ou l'argument pour la fonction .. – user46743

Répondre

2

Vous devez filtrer les objets manuellement:

for(Politician t : politicianSet){ // any way to get Trump Objects out of politicianSet? 
    if(t instanceof Trump) { 
    //do your magic here 
    } 
} 

L'opérateur instanceof retourne true si t est une instance (une sous-classe) Trump.

1

Ci-dessous le code travaillerait -

public Set<Trump> getSetOfTrump(Set<? extends Politician> politicians){ 
    return politicians.stream().filter(s -> s instanceof Trump).map(s ->(Trump)s).collect(Collectors.toSet()); 
}