我正在尝试使用过多的参数来在一个有“父对象和子对象”概念的系统中提供完整的类型安全性。我可能不会保留这种级别的参数化,因为编写参数变得如此难看。但是我在概念上有这样的东西:
ModelObject<BaseType extends ModelObject<BaseType, ChildType>, ChildType extends ModelObject<ChildType,?>>
{
abstract Set<ModelObject<?, BaseType>> getParents();
//other logic
}
这是简化版本,原始版本指定了父级以及基级和子级,使事情变得更加明确,甚至变得更加丑陋。
假设我确实保留了所有这些,主要的缺点是它只允许 child 有一种类型的 parent ,每个 parent 有一种类型的 child ,有时 parent 有两个 child 是有意义的。虽然我现在完全没有用处,但理论上生 3 个以上的 child 甚至是有意义的。
我可以允许两个 child 有一个界面,比如
MyObject extends ModelObject<MyObject, ChildA> implements hasChild<childB>
但显然这只适用于两个 child ,除非我想为“有 2 个 child ,有 3 个 child ”等制作一堆接口(interface)。
有什么方法可以编写一个通用抽象类,允许以某种方式创建任意数量的“子”参数,以便我可以编写与任何潜在“子”列表匹配的子对象?我怀疑答案是否定的,但我很好奇。整个结构可能不适合使用,因为限制太多,而且所有类型都漂浮在周围,有点难看;但只是为了好玩而涉足其中,看看是否可以做到:)
最佳答案
您的问题的细节有点不清楚,但要回答您的更基本问题“是否可以允许未指定大小的参数列表?”,那么简单的答案是肯定的。您可以在 Java 中使用可变长度参数列表;它叫做 varargs .
如果您有一个 MyObject 接口(interface),并且 MyObject1、MyObject2 等类都实现该接口(interface),那么您可以执行以下操作:
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)); //
}
关于Java参数,是否可以允许未指定大小的参数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489303/