0

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

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

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

ch02/genericStringLogs/LinkedGenericLog.java:10:ch02.genericStringLogs.LinkedGenericLog 不是抽象的,不会覆盖 ch02.genericStringLogs.GenericLogInterface 中的抽象方法 contains(java.lang.Object)

通过在 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”并使用命令行编译)

4

2 回答 2

3

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

public class LinkedGenericLog<T> implements GenericLogInterface

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

public class LinkedGenericLog<T> implements GenericLogInterface<T>
于 2013-02-27T21:21:30.650 回答
2

问题是您正在实现. GenericLogInterface这会导致各种问题,涉及两个不同的类型参数。你需要做的就是改变这个:

public class LinkedGenericLog<T> implements GenericLogInterface<T>

对此:

public class LinkedGenericLog<T> implements GenericLogInterface

那么你应该停止使用原始类型LLGenericNode。所以:

protected LLGenericNode log;

应该:

protected LLGenericNode<T> log;

这(在insert):

LLGenericNode newNode = new LLGenericNode(element);

应该:

LLGenericNode<T> newNode = new LLGenericNode<T>(element);

同上使用LLGenericNodeintoString()contains()

...而且在其内部LLGenericNode。基本上,无论您在哪里使用原始类型,都不要这样做:)

于 2013-02-27T21:22:01.030 回答