Java - 抽象类的集合,子集包含不同的对象 - 处理这些包装对象的任何“好”方法?

时间:2013-08-26 21:56:54

标签: java generics collections types erasure

假设我们有这样的事情:

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孩子,使用访问者等,但这可能是不可行的,因为这些操作可能依赖于Collection中的其他MyClass子项。一个MyClass孩子可能不会决定自己采取的行动,甚至任何单一的MyClass集合。其中一些行动可能是累积的,取决于许多其他潜在的累积因素。

有没有“好”的方法来解决这个问题,或者我只是被诅咒到丑陋的类型条件或类似的东西?我考虑在MyClass中使用Generics并在所有孩子身上使用具体类型。这可以简化对象的检索,但仍然需要一个大的条件块。

1 个答案:

答案 0 :(得分:0)

你在你的问题中丢弃了“好”的做法。在这种情况下,泛型无济于事。是的,你会被诅咒到一个讨厌的地方,因为丑陋的类型检查使用。您可以使用名为category的公共实例成员以及getCategory中定义的相应访问者MyClass来伪装类型检查。如果可以switch,他们会if getCategory()if但是,无论是否检查类型,谴责您的人都可能不喜欢switchesfor(MyClass e: collection ) e.doYourAction(); 。而且他们也可以聪明并且了解你想要做什么。除了

之外的任何事情
{{1}}

是“坏”。

现在,对于似乎根本没有规范的软件,你可能会得到赦免。