Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中子类的泛型_Java_Generics - Fatal编程技术网

java中子类的泛型

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 } }

我有以下代码片段,其中我实现了Bag容器,Bag类实现了Iterable接口

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

    }
}