java中子类的泛型
我有以下代码片段,其中我实现了Bag容器,Bag类实现了Iterable接口java中子类的泛型,java,generics,Java,Generics,我有以下代码片段,其中我实现了Bag容器,Bag类实现了Iterable接口 public class ResizingArrayBag<Item> implements Iterable<Item> { //Some bag methods private class ListIterator<Item> implements Iterator<Item> { //ListIterator methods } }
public class ResizingArrayBag<Item> implements Iterable<Item> {
//Some bag methods
private class ListIterator<Item> implements Iterator<Item> {
//ListIterator methods
}
}
public类ResizingArrayBag实现Iterable{
//一些袋法
私有类ListIterator实现了迭代器{
//列表迭代器方法
}
}
列表迭代器
类中的项
与大小调整ArrayBag
中的项
不同吗
为什么我们要将Iterable
和迭代器
与项
一起声明,并且这些中的项
与列表迭代器
和ResizingArrayBag
不同
列表迭代器
类中的项
与大小调整ArrayBag
中的项
不同吗
对。这称为类型参数隐藏,不鼓励这样做,因为这可能会导致严重的混淆。例如,可以提供以下声明:
ResizingArrayBag<A>.ListIterator<B> x = new ResizingArrayBag<A>().ListIterator<B>();
请注意,这里我们不是重新定义项
类型参数,而是重用已定义的ResizingArrayBag
类型参数
另一条经验法则是,您应该使用单大写字母命名类型参数<代码>项目可能会产生误导,尤其是当某处存在称为项目
的特定类型时
因此,与其命名您的类型参数Item
,不如选择以下内容:
public class ResizingArrayBag<T> implements Iterable<T> {
private class ListIterator implements Iterator<T> {
}
}
public类ResizingArrayBag实现Iterable{
私有类ListIterator实现了迭代器{
}
}
为什么我们要将Iterable
和迭代器
与项
一起声明,并且这些中的项
与列表迭代器
和ResizingArrayBag
不同
实现
Iterable
将强制您实现.iterator()
方法,在该方法中,您必须返回一个iterator
实现。Item
在这两种情况下都是同一类。如果您的类实现了Iterable
,这意味着它有一个方法返回一个迭代器,该迭代器定义了内部元素(Item
s)的迭代方式。(next,hasNext,remove)内部类是语法糖,不需要让这两种类型相等,但这是必需的。您能给我一个例子,说明内部类和父类在客户端测试中有不同的项吗?是的。可以编写:newouterClass().newinnerClass()
,其中A
和B
是不同的类型。这不安全。:)
public class ResizingArrayBag<T> implements Iterable<T> {
private class ListIterator implements Iterator<T> {
}
}