从 <?扩展动物>
retrieving sub type from a <? extends Animal>
有一个现有的 Set<Trump>
被传递给另一个接受 Set<? extends Politician>
作为参数的函数。鉴于 Set<? extends Politician>
将仅包含一个 Politician
对象或一个 Trump
对象。
Politican
Class无法修改。 Trump
Class可修改
有没有办法干净地执行以下操作,或者应该如何重新设计派生的 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());
}
有一个现有的 Set<Trump>
被传递给另一个接受 Set<? extends Politician>
作为参数的函数。鉴于 Set<? extends Politician>
将仅包含一个 Politician
对象或一个 Trump
对象。
Politican
Class无法修改。 Trump
Class可修改
有没有办法干净地执行以下操作,或者应该如何重新设计派生的 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());
}