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*的解决方案是否也可以实现这一点?如果可能的话,我不想实现自己的迭代器——对我来说这似乎不是必要的,因为我只想在接口的元素上提供迭代器,而不是实现类
# 1 楼答案
你能改变界面吗
您始终可以实现自己的迭代器:
没有测试代码
# 2 楼答案
接口可以这样定义:
那么实现应该如下所示:
这有以下优点:
OtherClass
对象调用list()
时,您将得到一个LinkedList<OtherClass>
OtherClassInterface
对象调用list()
时,您将得到一个LinkedList<OtherClassInterface>
list().iterator()
获得# 3 楼答案
你能这样定义接口吗
list.iterator()
应该是该方法的有效返回值,即使列表是List<OtherClass>
# 4 楼答案
您可以编写自己的
Iterator
实现,在从next()
返回时在接口和具体实现之间进行转换将
List<OtherClass>
转换为List<OtherClassInterface>
的问题在于,无法阻止转换结果的用户将OtherClass
对象以外的对象放入列表(当然,这些元素也必须实现OtherClassInterface
)