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

时间:2012-05-17 11:47:55

标签: java interface iterator type-conversion

在课堂上,我有一个容器:

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。 我只想让使用代码的人使用这些接口。 问题是我想在OtherClass内部使用完整的MyClass,但是将LinkedList<OtherClassInterface>上的迭代器传递给MyClassInterface.iterator()的调用者。

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

如何处理这种情况?

修改

我想要这种行为的原因

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

如上所述,其他开发人员想要使用这两个接口。在更高的一个上,我想提供一个迭代器,它可以访问下层接口的元素 - 但不能访问实现接口的类。

其他需求

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

4 个答案:

答案 0 :(得分:1)

您可以编写自己的Iterator实现,在从next()

返回时在界面和具体实现之间进行转换

List<OtherClass>转换为List<OtherClassInterface>的问题在于,无法阻止转化结果的用户将除OtherClass个对象之外的内容放入列表中(当然那些元素必须实现OtherClassInterface

答案 1 :(得分:1)

你能定义这样的界面吗?

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

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

答案 2 :(得分:0)

你能改变界面吗?

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() {

            }
        };
  }
}

没有测试代码

答案 3 :(得分:0)

界面可以这样定义:

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

然后实现应该如下所示:

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

这具有以下优点:

  • 通过list()对象致电OtherClass,您将获得LinkedList<OtherClass>
  • 通过list()对象致电OtherClassInterface,您将获得LinkedList<OtherClassInterface>
  • 每个循环的返回值都可以用于for-each循环
  • 迭代器可以通过list().iterator()
  • 获得