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

标签 java generics

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

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/

相关文章:

java - @ConditionalOnProperty : does it have an impact only on annotation specified below?

java - 通过单击按键更改 JFrame 的内容

java - Applet 参数包含反斜杠。

java - 在 EJB 2 session Bean 中实现单例功能

java - 两次捕获相同的异常

java - 泛型 - 类型中的方法不适用于参数

Swift:为函数类型专门化泛型类的方法

typescript - 从通用接口(interface)的类型创建通用函数

c# - 为什么 .NET 中的通用 Dictionary 不提供 ForEach() 方法?

java - 什么类型返回get方法?