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

Posted

技术标签:

【中文标题】Java 泛型编译错误:不兼容的类型:Item#1 无法转换为 Item#2【英文标题】:Java Generics compilation error: incompatible types: Item#1 cannot be converted to Item#2 【发布时间】:2015-04-04 07:59:02 【问题描述】:

我正在构建自己的 collection 类,以 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 进行了比较,并没有看到任何可能导致我这边出现问题的差异。有没有人我错过了什么以及如何摆脱错误?

【问题讨论】:

【参考方案1】:

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

您正在声明一个名为Item 类型变量。您没有重用使用Deque&lt;Item&gt; 声明的那个。这些可能是不同的类型。相反,摆脱参数声明

private class DequeIterator implements Iterator<Item> 

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


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

return new DequeIterator<Item>();

更改为

return new DequeIterator();

【讨论】:

非常感谢您的快速回复!删除 &lt;Item&gt; 给了我另一个编译错误:Deque.DequeIterator does not take parameters return new DequeIterator&lt;Item&gt;(); @nburk 哦,是的,删除 DequeIterator 的任何参数化。

以上是关于Java 泛型编译错误:不兼容的类型:Item#1 无法转换为 Item#2的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的泛型类是啥东西?

Java泛型——你所不知道的那些泛型背后

java泛型

java泛型

[ Java面试题 ]泛型篇

Java 泛型