从overriden方法调用(非公共)方法

时间:2015-06-10 21:26:44

标签: java arraylist get overwrite

我遇到覆盖问题(我相当新的问题),我会专门发布我的问题。

我创建了一个扩展ArrayList的课程。

关于我必须做什么以及有关覆盖,我有几个问题。

首先,如果ArrayList实现并扩展了它所需要的全部内容,那么扩展ArrayList的新类也将“自动”扩展并实现必要的类和接口。我很想假设是的,因为我知道你只能扩展一个班级。

我的第二个问题是关于覆盖。

我已经覆盖了方法get()

@SuppressWarnings("unchecked")
E elementData(int index) {
    return (E) elementData[index];
}

/**
 * Returns the element at the specified position in this list.
 *
 * @param  index index of the element to return
 * @return the element at the specified position in this list
 * @throws IndexOutOfBoundsException {@inheritDoc}
 */
public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

为:

@Override
public E get(int index) {
    DoSomethingWithIndex...
    return elementData(index);
}

注意:我已将上面的代码包含在源代码中。 E elementData ...

我没有覆盖这个。

我的问题是我被告知无法找到elementData(我的重写get方法的返回)。我还应该覆盖它吗?是不是ArrayList扩展了。我不明白为什么找不到它。

3 个答案:

答案 0 :(得分:2)

  

首先,如果ArrayList实现并扩展了它所需要的全部内容,那么扩展ArrayList的新类也将自动地#34;扩展并实现必要的类和相互作用。

是。例如,下面的类完全有效:

public class MyList extends ArrayList<String> {
    // Empty!
}

无需实施任何内容或提及任何接口。

  

我的问题是我被告知无法找到elementData(我的覆盖get方法的返回)。

那是对的。 elementData是私有的,无法在子类中访问。相反,使用

@Override
public E get(int index) {
    DoSomethingWithIndex...
    return super.get(index);  // Delegate call to overridden method.
}

最后,扩展ArrayList很少是正确的做法。你应该几乎总是喜欢组合而不是继承。例如,见:

答案 1 :(得分:1)

我完全不了解你的第二个问题,但对于第一个问题,答案是:是的。 使用ArrayList实现的所有内容都与您的子类一起实现。您只需要在代码中导入要显式使用的类,例如在覆盖某些内容时。

答案 2 :(得分:1)

你可能想要来自Effective Java, Second Edition的Joshua Bloch的建议,第16项:赞成继承继承。

也就是说,不是直接扩展ArrayList,而是创建一个包含它的类,它也实现List。这样,您还可以避免在实现中出现一些未记录的问题。

在上述图书的示例中,HashSet&#39; addAll调用了add方法,但没有记录为这样做,因为它不是{&1;}写下遗产。