Java参数,是否可以允许未指定大小的参数列表?

时间:2013-05-10 19:13:48

标签: java generics

我在涉及过多的参数,以便在我有“父母和子女”对象概念的系统中提供完整的类型安全性。我可能不会保持这种级别的参数化,因为编写参数非常难看。但是我有一些概念上的东西:

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

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

 //other logic
 }

这是简化版本,原始版本指定了父级以及基础和子级,使事情更加明确,甚至更加丑陋。

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

我可以允许两个有界面的孩子,比如

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

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

有没有什么方法可以编写一个通用的抽象类,允许以某种方式创建任意数量的'子'参数,这样我就可以编写匹配任何潜在'孩子'列表的子对象?我怀疑答案是否定的,但我很好奇。整个结构可能不适用于过于严格和有点丑陋的所有类型浮动;但为了看看是否可以做到这一点,我们正在探索它:)

3 个答案:

答案 0 :(得分:1)

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

如果您有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的这个特定实现将其子项存储在List中):

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

public boolean hasChildren(MyObject... children) {
    return parent.getChildren().containsAll(Arrays.asList(children)); // 
}

答案 1 :(得分:0)

您可以传递一个子列表,而不是每个子列表。然后它可以是任意数量,你不需要重新实现每个类。您需要以不同方式指定每个类的唯一原因是每个类是否根本不同。

答案 2 :(得分: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
    //...
}