有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:在迭代器类型(接口/实现类)之间转换?

在类中,我有一个容器:

public class MyClass implements MyClassInterface {
  private LinkedList<OtherClass> list; //Need to use 'OtherClass' instead of 'OtherClassInterface here
  @Override
  public Iterator iterator() {
    return list.iterator; //Problem!
  }
}

界面:

public interface MyClassInterface {
  //Is
  public Iterator iterator();
  //Should be
  public Iterator<OtherClassInterface>();
}

另外,OtherClass还有一个接口OtherClassInterface。 我只想让使用代码的人使用接口。 问题是我想在MyClass内使用完整的OtherClass,但要将LinkedList<OtherClassInterface>上的迭代器传递给MyClassInterface.iterator()的调用者

我无法将现有的LinkedList<OtherClass>强制转换为LinkedList<OtherClassInterface>内的MyClass以返回所需的迭代器

如何处理这种情况

编辑

我想要这种行为的原因

对于另一个开发人员,我想提供两个接口:第一个接口允许他访问一个更高的数据结构,该数据结构包含一个更低的数据结构,他应该通过第二个接口访问该数据结构。在高级接口的实现类中,我直接使用低级数据结构的类型,而不是在低级接口上

如前所述,另一个开发人员希望使用这两个接口。在更高的接口上,我希望提供一个迭代器,该迭代器允许访问较低接口的元素,但不允许访问实现该接口的类

额外需求

我还希望返回的迭代器是“Iterable”,也就是说,这样我就可以使用“for each”结构。*waxwing*的解决方案是否也可以实现这一点?如果可能的话,我不想实现自己的迭代器——对我来说这似乎不是必要的,因为我只想在接口的元素上提供迭代器,而不是实现类


共 (4) 个答案

  1. # 1 楼答案

    你能改变界面吗

    public interface MyClassInterface<T> {
        public Iterator<T> iterator();
    }
    

    您始终可以实现自己的迭代器:

    public class MyClass implements MyClassInterface<T> {
      private LinkedList<T> list;
    
      @Override
      public Iterator iterator() {
       return new Iterator<T>() {
                int index;
    
                public boolean hasNext() {
                    return index < list.size();
                }
    
                public T next() {
                    return list.get(index++);
                }
    
                public void remove() {
    
                }
            };
      }
    }
    

    没有测试代码

  2. # 2 楼答案

    接口可以这样定义:

    public interface MyClassInterface {
        public LinkedList<? extends OtherClassInterface> list();
    }
    

    那么实现应该如下所示:

    @Override
    public LinkedList<OtherClass> list() {
        return list; //this is the container of type LinkedList<OtherClass>
    }
    

    这有以下优点:

    • 当通过OtherClass对象调用list()时,您将得到一个LinkedList<OtherClass>
    • 当通过OtherClassInterface对象调用list()时,您将得到一个LinkedList<OtherClassInterface>
    • 可以在for each循环中使用每个的返回值
    • 迭代器可以通过list().iterator()获得
  3. # 3 楼答案

    你能这样定义接口吗

    public interface MyClassInterface {
        public Iterator<? extends OtherClassInterface>();
    }
    

    list.iterator()应该是该方法的有效返回值,即使列表是List<OtherClass>

  4. # 4 楼答案

    您可以编写自己的Iterator实现,在从next()返回时在接口和具体实现之间进行转换

    List<OtherClass>转换为List<OtherClassInterface>的问题在于,无法阻止转换结果的用户将OtherClass对象以外的对象放入列表(当然,这些元素也必须实现OtherClassInterface