【发布时间】:2015-09-12 05:11:50
【问题描述】:
我有一个List 类型为MyClass<T> 的通用对象,我不知道它的确切类型:List<MyClass<? extends Object>>。
有没有办法过滤此列表以仅获取那些具有特定T而不使用instanceof的对象?。
我觉得这可以通过Visitor pattern 和T 的每个特定实例的子类化来完成(例如MyClassString extends MyClass<String>,这不是问题),但我不想为每个子类实现一个访问者:
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添加另一个案例。访问者模式强制所有打开类型(使用访问者)的人在将新类型添加到程序时考虑它。