I have a List
of generic objects of type MyClass<T>
of which I do not know the exact type: List<MyClass<? extends Object>>
.
Is there a way to filter this list to obtain only those objects that have a specific T
without casting or using instanceof
?.
I have the feeling this can be done with the Visitor pattern and subclassing per specific instance of T
(like MyClassString extends MyClass<String>
, which is not a problem), but I do not want to implement a Visitor for every subclass:
class MyClassString extends MyClass<String> {
public <U> U accept(MyClassVisitor<U> visitor) {
return visitor.visitMyClassString(this);
}
}
interface MyClassVisitor<U> {
U visitMyClassString(MyClassString myClassString);
U visitMyClassDouble(MyClassDouble myClassDouble);
...
}
class FilterMyClassStringService implements MyClassVisitor<List<MyClassString>> {
public List<MyClassString> filterMyClassString(List<MyClass<? extends Object>> toFilter) {
List<MyClassString> filteredList = new ArrayList<>();
for (MyClass<? extends Object> elem : toFilter) {
filteredList.addAll(elem.accept(this));
}
return filteredList;
}
@Override
public List<MyClassString> visitMyClassString(MyClassString myClassString) {
List<MyClassString> listWithMyClassString = new ArrayList<>();
listWithMyClassString.add(myClassString);
return listWithMyClassString;
}
@Override
public List<MyClassString> visitMyClassDouble(MyClassDouble myClassDouble) {
return new ArrayList<MyClassString>();
}
}
Is there any way?