2012-10-01 37 views
0

首先,我在Java方面几乎没有什么经验。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(){  

编译器创建下面的方法没有找到符号。当然,我们需要首先在界面中声明它。问题是,如果我们尝试这样做,接口不知道节点是什么。 所以我在这里陷入僵局。

我得到的错误:

Cannot find symbol 
    symbol : method getHead() 
    location: interface List<E> 
    Node<E> lhead = list.getHead(); 

我希望它让getHead具体实现的方法是什么。我怎么做?

我问,我们可以将执行过程中的内部类移动到界面吗? 不知道如何来解决这个问题,

感谢您的时间

+1

你在哪里试图把这种方法?为我编译好 –

+0

为什么'getHead()'返回'E'? –

+0

@MattBall什么? 'head'是'Node '的一个实例,所以'getHead'应该返回'Node ',不是吗? –

回答

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 
} 
+0

好吧,让我试试。因为它是一个特定于实现的方法,并且由于某种原因不能编译。 – Alessandroempire

+0

事情是我需要使用方法里面的getHead – Alessandroempire

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

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; 
} 
+0

我确实有getSize。但我需要gethead才能比较。由于某种原因,不编译 – Alessandroempire

+0

我不明白getHead()方法的目的,因为你需要迭代所有元素来比较它们。实际上,您可以使用get(...)方法遍历列表并比较元素本身。 –

+0

是的,但我必须比较头部内的元素,如何在不使用getHead的情况下访问另一个列表的头部? – Alessandroempire

相关问题