【问题标题】:is it possible to change iterator type ? of iterator created from classes that implemets interface是否可以更改迭代器类型?从实现接口的类创建的迭代器
【发布时间】:2022-01-10 04:15:52
【问题描述】:

可以这样投吗?

Iterator<Class that implemets the interface> -->  Iterator<Interface>

我的算法课中有这个成员

 public HashMap<Integer, HashMap<NodeC, EdgeC>> edges;

在这个函数上,我正在生成一个迭代器类型 &lt;EdgeData&gt; 需要返回,但问题是我正在使用 Edge Class 的类,所以它会抛出错误

    @Override
    public Iterator<EdgeData> edgeIter(int node_id) {
 
       
            return this.edges.get(node_id).values().iterator();
        
      
    }


Incompatible types. Found: 'java.util.Iterator<src.api.Edge>', required: 'java.util.Iterator<src.interfaces.EdgeData>'```

关于图表的程序

结构

interfaces
  |-->  EdgeData
  |-->  Algo    

Classes 
  |--> Edge implements EdgeData
  |--> AlgoClass implements Algo

在我的 AlgoClass 中,我使用的是 HashMap> 边;

所以我通过首先传递边缘的源在 o(1) 中获得边缘,然后每个节点在其内部都有一个哈希图,因此通过传递目标我将获得正确的边缘!大约在 o(1) 中。

问题在于 edgeIter 函数中迭代器的返回类型,我需要它是 EdgeData 类型,如接口 EdgeData。 而且我不知道是否可以将迭代器转换为迭代器。

【问题讨论】:

  • 旁注:您应该使用Map&lt;Integer, Map&lt;Node, Edge&gt;&gt;。代码到接口,而不是实现。
  • 更好的是,将其更改为Map&lt;Integer, Map&lt;Node, EdgeData&gt;&gt;,然后您的迭代器自然会成为Iterator&lt;EdgeData&gt;
  • 这就是我最终做的;问题是一条边包含这个成员,src,dest,weight,我使用 src 作为地图的键,如果我有相同的 src,最终会超出值,所以我切换到Map&lt;String, Map&lt;Node, EdgeData&gt;&gt;,现在我将密钥保存为"src_" + src + "_dest_" + dest :)

标签: java iterator


【解决方案1】:

只需将返回类型更改为Iterator&lt;? extends EdgeData&gt;

如果您无法更改该界面,则必须解决该错误(因为该签名完全是错误的)。你可以,用丑陋的铸造。它会生成警告,然后您必须禁止该警告。只需投到Iterator&lt;EdgeData&gt;

【讨论】:

  • 我怎样才能转换为 Iterator
  • 我知道如何投射这样的类 (EdgeData) Edge
  • 但我不知道如何将 Iterator 转换为 Iterator
  • 我无法触摸界面
  • 语法相同:Iterator foo = (Iterator) bar;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多