我遇到覆盖问题(我相当新的问题),我会专门发布我的问题。
我创建了一个扩展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
扩展了。我不明白为什么找不到它。
答案 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;}写下遗产。