【发布时间】:2013-08-29 12:12:14
【问题描述】:
假设我们有这样的东西:
public abstract class MyClass {
//Stuff in here
}
public class MyClassA extends MyClass {
private String thingie; //Along with getter/setters, of course
//Other stuff
}
public class MyClassB extends MyClass {
private List<Integer> thingies; //Again, getters and setters to go with
//Other stuff
}
假设我们有任意数量的扩展 MyClass 的类,每个类都有自己的不同类型的实例变量,尽管有些可能具有相同的类型。这是一个不幸的必要性。现在,假设我们有一个 MyClass 的集合。我们有一个包含任意数量子类的集合,每个子类都包含一个对象。假设我需要遍历此 Collection,从任意数量的元素中检索所述对象,并对它执行操作、存储、操作、发送到其他地方等。这些对象除了扩展 Object 之外没有任何共同点。
我可能能够简单地将这些操作委托给 MyClass 子项本身、使用访问者等,但这可能不可行,因为这些操作可能依赖于集合中的其他 MyClass 子项。单个 MyClass 子项可能不会单独决定要采取的操作,甚至不会决定任何单个 MyClass 集合。其中一些行动可能是累积的,并且取决于许多其他潜在的累积因素。
有什么“好”的方法来处理这个问题,还是我会被诅咒到丑陋的类型检查条件或类似的地狱?我考虑在 MyClass 中使用泛型并在所有孩子身上使用具体类型。这可以简化对象的检索,但仍然需要一个大的条件块。
【问题讨论】:
-
不是泛型或类似的问题。问题是找到一个好的模式来达到结果
-
您真正的问题是,您一开始就将这些都放在了
Collection<MyClass>中,而没有保留其他信息。 -
贝拉巴克斯也是这样。 :) 问题已简化,但还有其他信息。该集合来自提交给线程池的一系列链式任务。每个任务都将执行,将响应对象放入集合中,然后根据结果确定下一个任务应该是什么。这一直持续到结束,此时返回集合并且主线程评估结果。采取的行动取决于许多因素,其中一些可能超出仅存在于该集合中的数据,即池中的其他作业是否具有类似的结果。
标签: java generics collections types erasure