我在涉及过多的参数,以便在我有“父母和子女”对象概念的系统中提供完整的类型安全性。我可能不会保持这种级别的参数化,因为编写参数非常难看。但是我有一些概念上的东西:
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个孩子”等制作一堆界面。
有没有什么方法可以编写一个通用的抽象类,允许以某种方式创建任意数量的'子'参数,这样我就可以编写匹配任何潜在'孩子'列表的子对象?我怀疑答案是否定的,但我很好奇。整个结构可能不适用于过于严格和有点丑陋的所有类型浮动;但为了看看是否可以做到这一点,我们正在探索它:)
答案 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
//...
}