java在实现类中声明一个方法,而不是在接口中

时间:2012-10-01 21:07:59

标签: java methods interface implementation

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

我问,我们可以将实现中的内部类移动到接口吗? 不知道如何解决这个问题,

感谢您的时间

3 个答案:

答案 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;
}