【问题标题】:What else I must do allow my method to handle any type of objects我还必须做什么才能让我的方法处理任何类型的对象
【发布时间】:2012-10-20 16:51:47
【问题描述】:

所以要允许任何类型对象,我必须在我的代码中使用泛型。

我为此重写了这个方法,但是当我创建一个对象(例如 Milk)时,它不会让我将它传递给我的方法。

我的通用版本有问题,或者我创建的 Milk 对象不好。

我应该如何正确传递我的对象并将其添加到链表中?

这是一种在我插入项目时会导致错误的方法:

   public void insertFirst(T dd)  // insert at front of list
   {
      Link newLink = new Link(dd);   // make new link

      if( isEmpty() )                // if empty list,
         last = newLink;             // newLink <-- last
      else
         first.previous = newLink;   // newLink <-- old first
      newLink.next = first;          // newLink --> old first
      first = newLink;               // first --> newLink
   }

这是我尝试插入链表的类:

class Milk
{
    String brand;
    double size;
    double price;

    Milk(String a, double b, double c)
    {
        brand = a;
        size = b;
        price = c;
    }
}

这是插入数据的测试方法:

   public static void main(String[] args)
      {                             // make a new list
      DoublyLinkedList theList = new DoublyLinkedList();

      // this causes:
      // The method insertFirst(Comparable) in the type DoublyLinkedList is not applicable for the arguments (Milk)
      theList.insertFirst(new Milk("brand", 1, 2));      // insert at front

      theList.displayForward();     // display list forward
      theList.displayBackward();    // display list backward
      }  // end main()
   }  // end class DoublyLinkedApp

声明:

class Link<T extends Comparable<T>>
   {}

class DoublyLinkedList<T extends Comparable<T>>
   {}

【问题讨论】:

  • 什么是LinkDoublyLinkedList 类?你确定他们不是Link&lt;T&gt;and DoublyLinkedList&lt;T&gt;?请至少添加这些类的声明。另外 - 你的错误到底是什么?
  • 你是对的。我将添加声明。

标签: java generics object linked-list


【解决方案1】:

根据您的错误,您已将 T 定义为 Comparable like

public class DoublyLinkedList<T extends Comparable<T>> {

但您添加的类型不是 Comparable。目前尚不清楚为什么您的课程需要具有可比性,因为您似乎没有在您的插入方法中使用它,所以我会放弃要求。

public class DoublyLinkedList<T> {

如果你要复制 JDK 中一个类的作用,我建议你通过阅读它的源代码来了解它是如何工作的。

http://www.docjar.com/html/api/java/util/LinkedList.java.html

【讨论】:

  • 注意,还有使用raw types的问题。
  • 但是,假设first 的类型是Link&lt;T&gt;(应该是这样),但仍然会导致错误,因为您尝试将原始类型分配给它。
【解决方案2】:

你必须像这样实例化你的列表:

DoublyLinkedList<Milk> theList = new DoublyLinkedList<Milk>();

我差点忘了……

Milk implements Comparable<Milk>

【讨论】:

  • 这会导致: 绑定不匹配:Milk 类型不是 DoublyLinkedList 类型的有界参数 > 的有效替代品。但修复了我之前的错误。
【解决方案3】:

好吧,您的 Milk 不够好 - 但这还不是全部。
应该是:

class Milk implements Comparable<Milk>

(你需要实现这个接口)。

另外:

Link newLink = new Link(dd);   

DoublyLinkedList theList = new DoublyLinkedList();

属于DoublyLinkedList&lt;Object&gt; 类型(它们是原始类型) - (Link&lt;Object&gt; 相同)也无法与所需类型进行比较(Object 不是Comparable&lt;Object&gt; )

所以你应该这样做才能修复它:

  1. 确保Milk 实现Comparable&lt;Milk&gt;
  2. 声明变量并将它们初始化为泛型类型:DoublyLinkedList&lt;Milk&gt;Link&lt;T&gt;

另一种选择(对于 1) - 如果您不需要 Comparable 功能 - 只需将它们都声明为:

class DoublyLinkedList<T>
class Link<T>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多