gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:35:55 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com