Java编译时错误: Compiler not recognizing method override

标签 java

我正在修改 Java 中日志的相当基本的链表实现以使用泛型。我的项目有 3 个 .java 文件:

  • GenericLogInterface.java -> 定义日志的接口(interface)
  • LLGenericNode.java -> 定义 LL 节点的类
  • LinkedGenericLog.java -> 定义 LL 的接口(interface)扩展

不幸的是,我收到来自 LinkedGenericLog.java 的编译时错误:

ch02/genericStringLogs/LinkedGenericLog.java:10: ch02.genericStringLogs.LinkedGenericLog is not abstract and does not override abstract method contains(java.lang.Object) in ch02.genericStringLogs.GenericLogInterface

通过重写 LinkedGenericLog.java 中 GenericLogInterface.java 的 contains() 方法,这似乎可以轻松解决。

然而,有一个巨大的障碍: 我已经覆盖它了。

这是三个 .java 文件的源代码:

GenericLogInterface.java

package ch02.genericStringLogs;

public interface GenericLogInterface<T>
{
  void insert(T element);
  // Precondition:   This GenericLog is not full.
  //
  // Places element into this GenericLog.

  boolean isFull();
  // Returns true if this GenericLog is full, otherwise returns false.

  int size();
  // Returns the number of Strings in this GenericLog.

  boolean contains(T element);
  // Returns true if element is in this GenericLog,
  // otherwise returns false.
  // Ignores case differences when doing string comparison.

  void clear();
  // Makes this GenericLog empty.

  String getName();
  // Returns the name of this GenericLog.

  String toString();
  // Returns a nicely formatted string representing this GenericLog.
}

LLGenericNode.java

package ch02.genericStringLogs;

public class LLGenericNode<T>
{
  private T info;
  private LLGenericNode link;

  public LLGenericNode(T info)
  {
    this.info = info;
    link = null;
  }

  public void setInfo(T info)
  // Sets info of this LLGenericNode.
  {
    this.info = info;
  }

  public T getInfo()
  // Returns info of this LLGenericNode.
  {
    return info;
  }

  public void setLink(LLGenericNode link)
  // Sets link of this LLGenericNode.
  {
    this.link = link;
  }

  public LLGenericNode getLink()
  // Returns link of this LLGenericNode.
  {
    return link;
  }
}

LinkedGenericLog.java

package ch02.genericStringLogs;

public class LinkedGenericLog<T> implements GenericLogInterface
{
  protected LLGenericNode log; // reference to first node of linked
                              // list that holds the GenericLog items
  protected String name;      // name of this GenericLog

  public LinkedGenericLog(String name)
  // Instantiates and returns a reference to an empty GenericLog object
  // with name "name".
  {
    log = null;
    this.name = name;
  }

  public void insert(T element)
  // Precondition:   This GenericLog is not full.
  //
  // Places element into this GenericLog.
  {
    LLGenericNode newNode = new LLGenericNode(element);
    newNode.setLink(log);
    log = newNode;
  }

  public boolean isFull()
  // Returns true if this GenericLog is full, false otherwise.
  {
    return false;
  }

  public int size()
  // Returns the number of items in this GenericLog.
  {
    int count = 0;
    LLGenericNode node;
    node = log;
while (node != null)
    {
      count++;
      node = node.getLink();
    }
    return count;
  }

  public boolean contains(T element)
  // Returns true if element is in this GenericLog,
  // otherwise returns false.
  // Ignores case difference when doing comparison.
  {
    LLGenericNode node;
    node = log;

    while (node != null)
    {
      if (element.equals(node.getInfo()))  // if they match
        return true;
      else
        node = node.getLink();
    }

   return false;
  }

  public void clear()
  // Makes this GenericLog empty.
  {
    log = null;
  }

  public String getName()
  // Returns the name of this GenericLog.
  {
    return name;
  }

  public String toString()
  // Returns a nicely formatted string representing this GenericLog.
  {
    String logString = "Log: " + name + "\n\n";
    LLGenericNode node;
node = log;
    int count = 0;

    while (node != null)
    {
      count++;
      logString = logString + count + ". " + node.getInfo() + "\n";
      node = node.getLink();
    }

    return logString;
  }
}

如您所见,我已经重写了 LinkedGenericLog.java 中的 contains() 然而,编译器仍然向我抛出这个错误。 我认为这与我在 contains() 方法的参数中使用泛型有关,但我对泛型很陌生,无法理解这个问题。

有人可以帮助我吗?

(顺便说一句,我正在运行 java 版本“1.6.0_15”并使用命令行进行编译)

最佳答案

在java中,方法签名包括参数及其类型。所以我不得不说 LinkedGenericLog 中的 T 类型与 GenericLogInterface

中的类型不同
public class LinkedGenericLog<T> implements GenericLogInterface

该行并不表示 T 相同,您应该将其替换为:

public class LinkedGenericLog<T> implements GenericLogInterface<T>

关于Java编译时错误: Compiler not recognizing method override,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122613/

相关文章:

java - Spring MVC - 在浏览器中显示来自数据库的数据

java - 当我说 Prepared 语句是预编译的是什么意思?

Java 按第三个元素对数组进行排序

java - 如何成功修改 JFrame(及其所有组件)的绘制方式?

java - 在JAVA中如何写一个只要数组包含某个值就会不断循环的语句

java - 如何在 SuggestBOX 中保存除关键字以外的 id?

Java - 需要 MySQL 并发解决方案

java - 线程 "main"中的异常 org.hibernate.HibernateException : Error accessing stax stream

java - 应用程序适用于 java 6 但不适用于 java 7

java - 如何知道servlet是否有很多请求