【问题标题】:Iterator.next() return type in Java?Java中的Iterator.next()返回类型?
【发布时间】:2018-10-10 06:20:03
【问题描述】:

我在以下代码中遇到错误:

Class ABC{
  public <T extends Object> void process(Entity entity){
  List<T> list = entity.getList();
    Iterator<T> iterator = list.iterator();
    while(iterator.hasNext()){
        T currentItem = iterator.next();
        processCurrentItem();
    }
   }
}

执行iterator.next()时的错误: java.util.LinkedHashMap 无法转换为 Object

我的问题是特定于我的用例的问题,还是我无法理解如何利用哈希图并将其转换为我选择的对象 ?

【问题讨论】:

  • 请包含更多代码。我在您的代码中没有看到任何 HashMap(或 LinkedHashMap),也不清楚 T 的声明位置/方式。
  • 请提供完整的错误堆栈跟踪。
  • @Eran 我正在使用的列表是 T 类型对象的列表,并且列表上的迭代器返回 LinkedHashMap 而不是 T 类型的元素。如果编辑没有,请告诉我没有帮助。
  • 哪一行抛出异常?
  • 您是否在某处导入了一个名为Object 的类?

标签: java list iterator generic-programming


【解决方案1】:

问题(如 cmets 中所述)是一个名为 Object 的类的导入,它不是默认的 (java.lang.Object)。因此,T extends Object 被解释为“扩展该自定义 Object 类的类”,而 java.util.LinkedHashMap 不会这样做。

如果您打算使用默认的java.lang.Object,解决方案是删除导入。如果您确实需要自定义 Object 类,您可以改为将 &lt;T extends Object&gt; 更改为 &lt;T extends java.lang.Object&gt;,或者直接将 &lt;T&gt; 更改为 extends java.lang.Object,因为 extends java.lang.Object 是默认值。

【讨论】:

  • 我得到了区分 Object 和 java.lang.Object 的要点,但是我对给定问题的解决方案的实现感到困惑。你的意思是说我只能使用与 LinkedHashMap 兼容的对象来捕获 iterator.next() 方法调用的响应?
  • 另一个观察结果是:T currentItem = iterator.next(); -- 不会在编辑器中抛出错误,而是会抛出运行时错误,LinkedHashMap 无法强制转换为 Object。另一方面, HashMap map = iterator.next(); --编译前报错,无法从T转换为HashMap。
  • 我认为进口不是问题吗?如果是这样,我需要删除这个答案。但是,是的,我的意思是,由于 T 绑定到您的自定义 Object 类,那么您的 List 和 Iterator 可能只包含扩展该 Object 类的对象,仅此而已。否则,您将获得类转换异常。奇怪的是,如果不向List&lt;T&gt; 添加演员表,我什至无法编译您的示例:ideone.com/dUb1Cu
猜你喜欢
  • 1970-01-01
  • 2019-02-02
  • 2014-10-02
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多