2016-11-14 1 views
0

Set<? extends Politician>을 인수로 사용하는 다른 함수로 전달되는 기존 Set<Trump>이 있습니다. Set<? extends Politician>에는 Politician Object 또는 Trump Object 만 포함됩니다.<? 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 .. 예 .. 리플렉션 또는 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()); 
} 
관련 문제