У меня есть List
общих объектов типа MyClass<T>
, из которых я не знаю точный тип: List<MyClass<? extends Object>>
.Фильтрация Список общих объектов для одного типового экземпляра
Есть ли способ, чтобы отфильтровать этот список, чтобы получить только те объекты, которые имеют конкретный T
без литья или с использованием instanceof
?.
У меня есть чувство, что это может быть сделано с Visitor pattern и подклассов на конкретный экземпляр T
(как MyClassString extends MyClass<String>
, которая не является проблемой), но я не хочу, чтобы реализовать Visitor для каждого подкласса:
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>();
}
}
Есть ли способ?
Если вы используете Java 8, вы можете использовать поток для фильтрации. –
не могли бы вы рассказать нам, почему вы не хотите использовать экземпляр? Это дорого? –
Честно говоря, я просто хочу знать, можно ли это сделать. Одна из причин против использования 'instanceOf' во многих местах заключается в том, что легко забыть добавлять другой случай в каждый' if', который проверяет тип. Шаблон посетителя заставляет всех, кто вводит тип (используя посетителя), рассматривать новый тип, когда он добавляется в программу. –