2

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

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

4 回答 4

1

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

转换List<OtherClass>为的问题List<OtherClassInterface>是没有办法阻止转换结果的用户将OtherClass对象以外的东西放入列表中(当然这些元素也必须实现OtherClassInterface

于 2012-05-17T11:53:25.127 回答
1

你可以这样定义接口吗?

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

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

于 2012-05-17T11:53:55.520 回答
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() {

            }
        };
  }
}

没有测试代码

于 2012-05-17T12:08:31.750 回答
1

接口可以这样定义:

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>
  • each 的返回值可以在 for-each 循环中使用
  • 迭代器可以通过list().iterator()
于 2012-06-14T11:31:37.523 回答