【问题标题】:Java parameters, is it possible to allow a list of parameters of unspecified size? [duplicate]Java参数,是否可以允许未指定大小的参数列表? [复制]
【发布时间】:2013-05-05 13:17:33
【问题描述】:

在我有“父子对象”概念的系统中,我曾尝试过多地使用参数以提供完整的类型安全性。我可能不会保持这种级别的参数化,因为编写参数变得如此丑陋。但是我在概念上是这样的:

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 个孩子”等制作一堆接口。

有什么方法可以编写一个通用抽象类,允许以某种方式创建任意数量的“子”参数,以便我可以编写与任何潜在“子”列表匹配的子对象?我怀疑答案是否定的,但我很好奇。整个结构可能不会因为所有类型的浮动而过于严格和有点丑陋;但是为了好玩而涉足它,看看它是否可以完成:)

【问题讨论】:

  • 我很困惑,你是想用类代替对象,用泛型代替集合吗?

标签: java generics


【解决方案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 的这个特定实现将其子项存储在列表中):

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

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

【讨论】:

  • 泛型和可变参数不能混合使用。
  • 这不是真正的正确答案;正如我在询问不适用于可变参数的泛型。但我显然没有正确地表达我的答案,因为 everyone 误解了它。所以我选择这个作为每个人的最佳答案,虽然我在问:)
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2018-06-22
      相关资源
      最近更新 更多