2016-11-14 91 views
0

有一个现有的Set<Trump>传递给另一个函数,它将Set<? extends Politician>作为参数。鉴于Set<? extends Politician>将包含Politician对象或仅包含Trump对象。从<?扩展动物>

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 ..是的..要做到没有反射或instanceof ..它可以重新设计派生类或参数的功能.. – user46743

回答

2

你必须手动筛选的对象:如果t是特朗普(的子类)的实例

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

instanceof运算符返回true。

1

下面的代码会工作 -

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