我有以下代码片段,我实现了Bag容器,而Bag类实现了Iterable接口。
public class ResizingArrayBag<Item> implements Iterable<Item> {
//Some bag methods
private class ListIterator<Item> implements Iterator<Item> {
//ListIterator methods
}
}
Item
中的ListIterator<Item>
与Item
中的ResizeingArrayBag<Item>
不同吗?
为什么我们已将Iterable
和Iterator
与Item
一起声明,并且这些Item
与ListIterator<Item>
和ResizingArrayBag<Item>
不同?
答案 0 :(得分:3)
Item
中的ListIterator<Item>
与Item
中的ResizeingArrayBag<Item>
不同吗?
是。这被称为类型参数隐藏并且不鼓励它,因为它可能导致严重的混淆。例如,可以提供以下声明:
ResizingArrayBag<A>.ListIterator<B> x = new ResizingArrayBag<A>().ListIterator<B>();
其中A
和B
是一些不同的真实类型。
如果ListIterator
应该包含与封闭ResizeingArrayBag
类型相同的元素,那么您必须这样做:
public class ResizingArrayBag<Item> implements Iterable<Item> {
//Some bag methods
private class ListIterator implements Iterator<Item> {
//ListIterator methods
}
}
请注意,我们不会重新定义Item
类型参数,而是重新使用ResizingArrayBag
已定义的类型参数。
另一个经验法则是你应该用单个大写字母命名你的类型参数。 Item
可能会产生误导,特别是如果存在某些特定类型(称为Item
)。
因此,不要将类型参数命名为Item
,而是选择以下内容:
public class ResizingArrayBag<T> implements Iterable<T> {
private class ListIterator implements Iterator<T> {
}
}
为什么我们已将
Iterable
和Iterator
与Item
一起声明,并且这些Item
与ListIterator<Item>
和ResizingArrayBag<Item>
不同?
实施Iterable
会强制您实施.iterator()
方法,您必须返回Iterator
实施。