0

首先,我在 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 成为特定于实现的方法。我怎么做?

请问,能否把implementation中的internal class移到interface中?不知道如何解决这个问题,

谢谢你的时间

4

3 回答 3

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(),而是使用迭代器并逐个比较项目。

于 2012-10-01T21:17:53.180 回答
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,这意味着如果您需要使用特定于实现(甚至List特定于)的方法,则需要进行类型检查:

public boolean equals(Object o)

    if (o == this)
        return true;

    if( o instanceof MyList<E> ){
        MyList<E> myList = (MyList<E>)o;
        // do MyList stuff here ...

    }
    // Things to do if you're comparing something that isn't a `MyList`
    // go here
}
于 2012-10-01T21:17:13.420 回答
0

只是出于好奇,但您的列表类应该有一个int getSize()andE 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;
}
于 2012-10-01T21:18:50.107 回答