java中子类的泛型

时间:2016-01-21 10:35:39

标签: java generics

我有以下代码片段,我实现了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>不同吗?

为什么我们已将IterableIteratorItem一起声明,并且这些ItemListIterator<Item>ResizingArrayBag<Item>不同?

1 个答案:

答案 0 :(得分:3)

  

Item中的ListIterator<Item>Item中的ResizeingArrayBag<Item>不同吗?

是。这被称为类型参数隐藏并且不鼓励它,因为它可能导致严重的混淆。例如,可以提供以下声明:

 ResizingArrayBag<A>.ListIterator<B> x = new ResizingArrayBag<A>().ListIterator<B>();

其中AB是一些不同的真实类型。

如果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> {

    }
}
  

为什么我们已将IterableIteratorItem一起声明,并且这些ItemListIterator<Item>ResizingArrayBag<Item>不同?

实施Iterable会强制您实施.iterator()方法,您必须返回Iterator实施。