0

在我有“父子对象”概念的系统中,我正在尝试使用过多的参数来提供完整的类型安全性。我可能不会保持这种级别的参数化,因为编写参数变得如此丑陋。但是我在概念上是这样的:

ModelObject<BaseType extends ModelObject<BaseType, ChildType>, ChildType extends ModelObject<ChildType,?>> 
{

 abstract Set<ModelObject<?, BaseType>> getParents();

 //other logic
 }

这是简化版,原版指定了 parent 以及 base 和 child 以使事情更明确,更丑陋。

假设我确实保留了所有这些,主要的弱点是它只允许孩子有一种类型的父母,每个父母只有一种类型的孩子,有时父母有两个孩子是有意义的。虽然我现在根本没有用它,但理论上说生 3 个以上的孩子甚至是有意义的。

我可以让两个孩子有一个界面,比如

MyObject extends ModelObject<MyObject, ChildA> implements hasChild<childB>

但显然这只适用于两个孩子,除非我想为“有 2 个孩子,有 3 个孩子”等制作一堆接口。

有什么方法可以编写一个通用抽象类,允许以某种方式创建任意数量的“子”参数,以便我可以编写与任何潜在“子”列表匹配的子对象?我怀疑答案是否定的,但我很好奇。整个结构可能不会因为所有类型的浮动而过于严格和有点丑陋;但是为了好玩而涉足它,看看是否可以做到:)

4

3 回答 3

1

您的问题的细节有点不清楚,但要回答您更基本的问题“是否可以允许未指定大小的参数列表?”,那么简单的答案是肯定的。您可以在 Java 中使用可变长度参数列表;它被称为可变参数

如果你有一个 MyObject 接口并且 MyObject1、MyObject2 等类都实现了该接口,那么你可以这样做:

private List<MyObject> getParents(MyObject... children) {
    List<MyObject> parents = new ArrayList<MyObject>();

    for(MyObject child : children) {
        parents.add(child.getParent());
    }

    return parents;
}

...或者这个(假设 MyObject 的这个特定实现将其子项存储在列表中):

public List<MyObject> getChildren() {
    return Collections.unmodifiableList(children);
}

public boolean hasChildren(MyObject... children) {
    return parent.getChildren().containsAll(Arrays.asList(children)); // 
}
于 2013-05-10T19:17:39.293 回答
0

You could pass a List of children, rather than each one individually. Then it could be an arbitrary amount and you wouldn't need to reimplement each class. The only reason you'd need to specify each class differently is if each one is fundamentally different.

于 2013-05-10T19:19:07.713 回答
0
void foo(Integer... x) {
    Integer x1 = x.length > 0 ? x[0] : 0; 
    Integer x2 = x.length > 1 ? x[1] : 0;//x2 is set to the value of the second string that was passed in
    //...
}
于 2013-05-10T19:21:45.673 回答