2016-11-14 107 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()); 
} 
相關問題