在课堂上,我有一个容器:
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解决方案吗?如果可能的话,我不想实现一个自己的迭代器 - 对我来说这似乎不是必要的,因为我只想在接口的元素而不是实现类上给出一个迭代器。
答案 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>
list().iterator()