Java Generics compilation error: incompatible types: Item#1 cannot be converted to Item#2

Java Generics compilation error: incompatible types: Item#1 cannot be converted to Item#2

我正在构建自己的 集合 class 在 Java 中实现 Iterable 接口。但是,我收到一个编译错误:

Nikolass-MacBook-Pro:week2 nburk$ javac Deque.java 

Deque.java:115: error: incompatible types: Item#1 cannot be converted to Item#2
         Item currentItem = current.item;
                                   ^
  where Item#1,Item#2 are type-variables:
    Item#1 extends Object declared in class Deque
    Item#2 extends Object declared in class Deque.DequeIterator
1 error

以下是我的代码的相关部分:

public class Deque<Item> implements Iterable<Item>  {

   // return an iterator over items in order from front to end
   public Iterator<Item> iterator() {
      return new DequeIterator<Item>();
   }

   private class DequeIterator<Item> implements Iterator<Item> {

      public DequeIterator() {

      }

      public Item next () {
         Item currentItem = current.item; // this line causes the ERROR
         current = current.next;
         return currentItem;
      }
   }
}

我认为这个问题在某种程度上是由于我以错误的方式使用了泛型,我的 Item 声明可能不正确。但是,我将我的实现与 this quick tutorial 进行了比较,没有发现任何可能导致我这边出现问题的差异。有人知道我遗漏了什么吗?我该如何消除错误?

private class DequeIterator<Item> implements Iterator<Item> {
    public DequeIterator() {
    }
} 

您正在声明一个名为 Itemnew 类型变量。您没有重用用 Deque<Item> 声明的那个。这些可能是不同的类型。相反,去掉参数声明

private class DequeIterator implements Iterator<Item> {

据推测,current.item 是对 Deque 中声明的 Item 类型对象的引用,但您试图将其分配给 Item 类型的变量] 在 DequeIterator.

中声明

您还需要删除 DequeIterator 的参数化,因为它不再是通用的。所以,例如

return new DequeIterator<Item>();

更改为

return new DequeIterator();