从 <?扩展动物>

retrieving sub type from a <? extends Animal>

有一个现有的 Set<Trump> 被传递给另一个接受 Set<? extends Politician> 作为参数的函数。鉴于 Set<? extends Politician> 将仅包含一个 Politician 对象或一个 Trump 对象。

PoliticanClass无法修改。 TrumpClass可修改

有没有办法干净地执行以下操作,或者应该如何重新设计派生的 class (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?
    }

} 

您必须手动过滤对象:

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

如果 t 是 Trump(的子类)的实例,instanceof 运算符 returns 为真。

下面的代码可以工作-

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