我必须做的其他事情允许我的方法处理任何类型的对象

时间:2012-10-20 16:51:48

标签: java generics object linked-list

因此,为了允许任何类型的对象,我必须在代码中使用泛型。

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

Ether我的通用修订版有问题,或者我创建的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>>
   {}

3 个答案:

答案 0 :(得分:4)

根据您的错误,您已将T定义为可比较

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

但是你要添加一个不可比的类型。不清楚为什么你的类需要具有可比性,因为你似乎没有在你的插入方法中使用它,所以我会放弃这个要求。

public class DoublyLinkedList<T> {

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

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

答案 1 :(得分:1)

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

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

我差点忘了......

Milk implements Comparable<Milk>

答案 2 :(得分:1)

嗯,你的Milk还不够好 - 但并非全部。
它应该是:

class Milk implements Comparable<Milk>

(您需要实现此接口)。

另外:

Link newLink = new Link(dd);   

DoublyLinkedList theList = new DoublyLinkedList();

类型DoublyLinkedList<Object>(它们是原始类型) - (和Link<Object>相同))也不能与所需类型相比较({{1} }不是Object

所以你应该这样做才能解决它:

  1. 确保Comparable<Object>实施Milk
  2. 声明您的变量并将其初始化为通用类型:Comparable<Milk>DoublyLinkedList<Milk>
  3. 替代方案(For 1) - 如果您不需要Link<T>功能 - 只需将它们声明为:

    Comparable