Java Generics编译错误:不兼容的类型:项目#1无法转换为Item#2

nbu*_*urk 2 java generics collections iterator iterable

我正在构建我自己的集合类,Iterable用Java 实现接口.但是,我收到编译错误说:

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
Run Code Online (Sandbox Code Playgroud)

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

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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为这个问题有点是因为我以错误的方式使用泛型并且我的声明Item可能不正确.但是,我将我的实现与这个快速教程进行了比较,并没有看到任何可能导致我这方面问题的差异.有什么我缺少的,我怎么能摆脱错误?

Sot*_*lis 9

private class DequeIterator<Item> implements Iterator<Item> {
    public DequeIterator() {
    }
} 
Run Code Online (Sandbox Code Playgroud)

你要声明一个名为的类型变量Item.你没有重用声明的那个Deque<Item>.这些可能是不同的类型.相反,摆脱参数声明

private class DequeIterator implements Iterator<Item> {
Run Code Online (Sandbox Code Playgroud)

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


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

return new DequeIterator<Item>();
Run Code Online (Sandbox Code Playgroud)

改变为

return new DequeIterator();
Run Code Online (Sandbox Code Playgroud)