Java 集合和迭代器接口作为内部类的实现
我正在尝试用迭代器作为内部类实现一个集合接口。实现集合的ArrayCollection类有一个泛型数组(说类成员是泛型的是否正确?)。Java 集合和迭代器接口作为内部类的实现,java,generics,data-structures,collections,types,Java,Generics,Data Structures,Collections,Types,我正在尝试用迭代器作为内部类实现一个集合接口。实现集合的ArrayCollection类有一个泛型数组(说类成员是泛型的是否正确?)。 公共类ArrayCollection实现了集合{ 私有T[]m=(T[])新对象[10]; 然而,当我为迭代器接口实现method next()时,我不断地得到一个不兼容的类型错误。然而,如果生成ArrayIterator,则非泛型类编译器在数组类型转换方面不再有问题。 私有类ArrayIterator实现迭代器{ 私有int游标=0; @凌驾 公共布尔h
公共类ArrayCollection实现了集合{
私有T[]m=(T[])新对象[10];
然而,当我为迭代器接口实现method next()时,我不断地得到一个不兼容的类型错误。然而,如果生成ArrayIterator,则非泛型类编译器在数组类型转换方面不再有问题。
私有类ArrayIterator实现迭代器{
私有int游标=0;
@凌驾
公共布尔hasNext(){
返回this.cursor>=ArrayCollection.this.size();
}
@凌驾
公共交通工具{
返回ArrayCollection.this.m[cursor++];
}
}
因此,我有几个问题:
在第二个示例中,您处理的是两个不同类型的变量。外部类和内部类各自定义了一个变量
T
,但它们并不相同。有几种方法可以解决此问题,一种是从内部类声明中删除T:
private class ArrayIterator implements Iterator<T> {
私有类ArrayIterator实现迭代器{
现在只引用外部T,而不引入单独的内部T
但是,我个人更喜欢将内部类设置为静态,在这种情况下,您不能使用外部类型的变量
private static class ArrayIterator<T> implements Iterator<T> {
私有静态类ArrayIterator实现迭代器{
如果执行此操作,则需要将类型变量从外部类型传递到内部类型:
return new ArrayIterator<T>();
返回新的ArrayIterator();
主要区别在于,定义类型参数的类会隐藏任何同名的现有类型参数,这会导致奇怪的错误消息
最后让我补充一点,从头开始实现集合通常不是一个好主意。相反,您可能希望扩展
AbstractCollection
或AbstractList
。这将让您专注于核心算法,但免费提供所有样板方法。在第二个示例中,您正在处理两种不同类型的变量。外部类和内部类各自定义了一个变量T
,但它们并不相同。有几种方法可以解决此问题,一种是从内部类声明中删除T:
private class ArrayIterator implements Iterator<T> {
私有类ArrayIterator实现迭代器{
现在只引用外部T,而不引入单独的内部T
但是,我个人更喜欢将内部类设置为静态,在这种情况下,您不能使用外部类型的变量
private static class ArrayIterator<T> implements Iterator<T> {
私有静态类ArrayIterator实现迭代器{
如果执行此操作,则需要将类型变量从外部类型传递到内部类型:
return new ArrayIterator<T>();
返回新的ArrayIterator();
主要区别在于,定义类型参数的类会隐藏任何同名的现有类型参数,这会导致奇怪的错误消息
最后让我补充一点,从头开始实现集合通常不是一个好主意。相反,您可能希望扩展
AbstractCollection
或AbstractList
。这将让您专注于核心算法,但免费为您提供所有样板方法。您将类型变量命名为类似的T
与ArrayCollection
的T
不同
您只需从数组迭代器中删除
(因为它是一个非静态的内部类),然后让迭代器从父类中使用T
:
private class ArrayIterator implements Iterator<T> {
私有类ArrayIterator实现迭代器{
这将解决编译问题和您的代码。您对类型变量的命名类似,ArrayIterator
的T
与ArrayCollection
的T
不同
您只需从数组迭代器中删除
(因为它是一个非静态的内部类),然后让迭代器从父类中使用T
:
private class ArrayIterator implements Iterator<T> {
私有类ArrayIterator实现迭代器{
这将解决编译问题和您的代码。您可以在此处共享代码吗?添加了代码。还有来自IDE的链接屏幕截图。我的堆栈溢出评级太低,无法直接向问题添加图像。从不添加图像,添加代码。hasNext()不应该吗
方法使用=
?---您还应该在下一步()中再次检查该方法
以正确抛出NoTouchElementException
而不是当前将发生的ArrayIndexOutOfBoundsException
。您可以在此处共享代码吗?添加了代码。还有来自IDE的链接截图。我的堆栈溢出率太低,无法直接将图像添加到问题中。从不添加图像,添加代码不是吗hasNext()
方法使用=
?---您还应该在next()
中再次检查,以正确抛出NoTouchElementException
,而不是当前将发生的ArrayIndexOutOfBoundsException
。