首先,我对Java没什么经验。
回答我的问题,我用自己的方法实现自己的列表。
public class MyList<E> implements List<E>{
private Node<E> head;
private static class Node<E> {
private E element;
.....
}
现在,这个类中有一个方法可以将此列表与给定的列表进行比较:
public boolean equals(List<E> list){
....
}
要启动此方法,首先我们必须得到列表的头部,所以之后我可以访问元素并比较列表。
现在,我们没有getHead()方法。
因此,我们尝试在实现类
public Node<E> getHead(){
编译器找不到符号。当然,我们需要先在界面中声明它。问题是,如果我们尝试这样做,接口就不知道Node是什么。 所以我在这里陷入僵局。
我收到错误:
Cannot find symbol
symbol : method getHead()
location: interface List<E>
Node<E> lhead = list.getHead();
我希望它能使getHead成为特定于实现的方法。我怎么做?
我问,我们可以将实现中的内部类移动到接口吗? 不知道如何解决这个问题,
感谢您的时间
答案 0 :(得分:2)
您是否正在实施java.util.List
或您创建的某个自定义List
界面?如果您使用的是标准类,那么您当然无法修改核心JDK类。
如果您有自定义List
界面,我会发现一些问题:
您的equals()
方法应接受Object
并向下转发。否则你重载而不是覆盖:
public boolean equals(Object obj) {
//check type first
List<E> list = (List<E>)obj;
Node
类是在MyList
内私有定义的。将其放在List
界面中,即可公开访问。
最后,通常根据内容而不是表示来定义equals()
。您可能有多个List
实现,只要它们以相同的顺序保存相同的数据,就应该认为列表是相同的。在您的实现中,只有使用head
抽象的列表是相同的。不要依赖getHead()
,而是使用迭代器并逐个比较项目。
答案 1 :(得分:0)
getHead()
是特定于实现的方法,它不属于接口。但这也意味着你不能将它作为接口的一部分使用,你必须将其称为实现类的方法:
List<String> myList = new MyList<String>();
myList.getHead() // Wrong. Compiler error.
MyList<String> myList = new MyList<String>();
myList.getHead() // Works :)
List<String> asList = myList; // If you want to work with a List from now on
在您的情况下,还存在equals
需要采用Object
的问题,这意味着如果您需要使用特定于实现(或甚至{{}},则需要进行类型检查{1}} - 特定的)方法:
List
答案 2 :(得分:0)
出于好奇,但您的列表类应该有int getSize()
和E get(int index)
方法(通常在列表中提供)。
现在,您可以检查大小是否相等,如果是这样,您可以迭代列表并逐个元素地比较(使用E get(int index)
方法)。
编辑:参考实施
public boolean equals(List<E> other) {
boolean equal = (getSize() == other.getSize());
for(int i = 0; i < getSize() && equal; i++) {
equal = get(i).equals(other.get(i));
}
return equal;
}