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

java在实现类中而不是在接口中声明方法,java,methods,interface,implementation,Java,Methods,Interface,Implementation,首先,我对Java几乎没有经验 说到我的问题,我正在用我自己的方法实现我自己的列表 public class MyList<E> implements List<E>{ private Node<E> head; private static class Node<E> { private E element; ..... } 公共类MyList实现列表{ 专用节点头; 私有静态类节点{ 私人电子元件; ....

首先,我对Java几乎没有经验

说到我的问题,我正在用我自己的方法实现我自己的列表

 public class MyList<E> implements List<E>{

 private Node<E> head;

 private static class Node<E> {
     private E element; 
     .....
 }
公共类MyList实现列表{
专用节点头;
私有静态类节点{
私人电子元件;
.....
}
现在,此类中有一个方法将此列表与给定列表进行比较:

public boolean equals(List<E> list){
....
}
public boolean equals(列表){
....
}
要开始此方法,首先我们必须获取列表的标题,以便之后我可以访问元素并比较列表。
现在,我们没有getHead()方法。 因此,我们尝试在实现类中创建以下方法

public Node<E> getHead(){    
公共节点getHead(){
编译器找不到符号。当然,我们需要首先在接口中声明它。问题是,如果我们尝试这样做,接口不知道节点是什么。 所以我在这里陷入僵局

我得到一个错误:

  Cannot find symbol
  symbol  : method getHead()
  location: interface List<E>
    Node<E> lhead = list.getHead();
找不到符号
符号:方法getHead()
位置:接口列表
节点lhead=list.getHead();
我希望它使getHead成为一个特定于实现的方法。我该怎么做

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

感谢您的时间

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
您是否正在实现或使用您创建的某个自定义
列表
接口?如果您使用的是标准类,当然不能修改核心JDK类

如果您有一个自定义的
列表
界面,我会看到一些问题:

  • 您的方法应接受
    对象
    和downcast。否则,您将重载而不是重写:

    公共布尔等于(对象obj){
    //先检查类型
    列表=(列表)对象;
    
  • 节点
    类是在
    MyList
    中私下定义的。将其放入
    列表
    界面,它将可公开访问

  • 最后,通常定义
    equals()
    在内容方面,而不是在表示方面。您可能有几个
    列表
    实现,只要它们以相同的顺序保存相同的数据,列表就应该被认为是相等的。在您的实现中,只有使用
    head
    抽象的列表是相等的。而不是依赖
    getHead()
    ,使用迭代器逐个比较项目


只是出于好奇,但是您的list类应该有一个
int getSize()
E get(int index)
方法(这通常在list中可用)。 现在,您可以检查大小是否相等,如果相等,您可以遍历列表并逐个元素进行比较(使用
eget(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;
}
公共布尔等于(列出其他){
布尔值等于=(getSize()==其他.getSize());
对于(int i=0;i
你想把这个方法放在哪里?对我来说编译很好为什么不
getHead()
return
E
?@MattBall What?
head
Node
的一个实例,因此
getHead
应该返回
Node
,否?@Alex Coleman我正试图将其放入实现类中。问题是,当我使用getHead时,它表示找不到符号。
public boolean equals(列表){
通常等于方法不是这样。参数类型是
对象
。它重载方法
公共布尔等于(对象){
。尝试使用
@Override
注释。我确实有getSize。但我需要gethead才能进行比较。由于某些原因,gethead()方法不是编译的。我不太理解gethead()方法的用途,因为您需要迭代所有元素来比较它们。事实上,您可以使用get来迭代列表(…)方法并比较元素本身。是的,但我必须比较head中的元素,如何在没有getHead的情况下访问另一个列表的head?@Alessandroempire:我添加了我的意思的引用实现!是的,但因此您有get()方法,该方法应在请求的索引处返回元素。如果索引为0,则应返回第一个元素,即head(如果有元素)。get(0)=head!get(1)=head.next,好的,让我试试。因为这是一个特定于实现的方法,出于某种原因,它不是编译的。问题是我需要在方法中使用getHead
public boolean equals(Object obj) {
  //check type first
  List<E> list = (List<E>)obj;
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;
}