【问题标题】:Force-call a specific constructor in a parent's class强制调用父类中的特定构造函数
【发布时间】:2013-04-22 13:10:35
【问题描述】:

我第一次遇到以下情况:

我有following java class

public class Values extends ArrayList<Object>{
    public Values() {

    }

    public Values(Object... vals) {
        super(vals.length);
        for(Object o: vals) {
            add(o);
        }
    }
}

我想拨打following parent's constructor

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

这可能吗?我正在发送int,但它被 Values 的构造函数捕获。

编辑

我最后想做的是:

Map<String,Object> document = getDocument();
List<String> indexFields = getIndexFields();
Values values = new Values(indexFields.size());
for (String field : indexFields) {
    values.add(document.get(field));
}

【问题讨论】:

  • 问题出在哪里? super(vals.length); 应该调用你想要的构造函数
  • @Crystark 这里有些问题。调用 super(vals.length) 调用 ArrayList, initialCapacity 构造函数。你怎么知道 conscturctor 没有被调用?
  • 建议:最好实现 List,标记一个内部 ArrayList 并将方法调用(add、addAll..etc)委托给 ArrayList 方法。
  • @MarcoForberg 我已经用我想做的事情编辑了我的帖子。它应该是不言自明的。正如你所看到的,我自己在循环,所以我不想做两次。
  • @Eugene 这不是被调用的问题。我的问题是我不希望调用“对象构造函数”而是调用“int 构造函数”

标签: java inheritance constructor overloading


【解决方案1】:

如果你想调用new Values(initialCapacity),其中initialCapacityint,那么你应该在Values类中有这样一个构造函数:

public Values(int initialCapacity) {
    super(initialCapacity);
}

请注意,扩展集合类通常不是一个好主意。使用它们(委托、组合)而不是扩展它们。

【讨论】:

  • 我就是这么想的。感谢您确认。
  • 嗯,如果你已经想到了,为什么不试试呢?
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2012-06-29
  • 2011-05-06
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-03-15
相关资源
最近更新 更多