2016-11-14 6 views
0

Существует существующий Set<Trump>, который передается другой функции, которая принимает в качестве аргумента Set<? extends Politician>. Учитывая, что Set<? extends Politician> будет содержать либо объект Politician, либо объект Trump.Получение подтипа из <? extends Animal>

Politican Класс не может быть изменен. Класс Trump доступен для модификации.

Есть ли способ сделать это следующим образом или как должен быть преобразован производный класс (Trump), чтобы иметь возможность сделать это?

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

без использования 'instanceof' или отражения? – bradimus

+1

Использование 'instanceof' может быть доказательством запаха кода .. но ... если у вас нет доступа к коду для супертипа, то он может быть лучшим, самым быстрым и дешевым вариантом для работы с экземплярами подтипа известного тип. – scottb

+0

@bradimus .. да .. Для этого без отражения или экземпляра .. его нормально переделать производный класс или аргумент для функции. – user46743

ответ

2

Вы должны фильтровать объекты вручную:

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

Оператор instanceof возвращает истину, если t является экземпляром (подкласса) Трампа.

1

Ниже код будет работать -

public Set<Trump> getSetOfTrump(Set<? extends Politician> politicians){ 
    return politicians.stream().filter(s -> s instanceof Trump).map(s ->(Trump)s).collect(Collectors.toSet()); 
} 
Смежные вопросы