Java 集合和迭代器接口作为内部类的实现

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类有一个泛型数组(说类成员是泛型的是否正确?)。

公共类ArrayCollection实现了集合{
私有T[]m=(T[])新对象[10];
然而,当我为迭代器接口实现method next()时,我不断地得到一个不兼容的类型错误。然而,如果生成ArrayIterator,则非泛型类编译器在数组类型转换方面不再有问题。

私有类ArrayIterator实现迭代器{
私有int游标=0;
@凌驾
公共布尔hasNext(){
返回this.cursor>=ArrayCollection.this.size();
}
@凌驾
公共交通工具{
返回ArrayCollection.this.m[cursor++];
}
}
因此,我有几个问题:

  • 如果我将ArrayIterator设置为非泛型,编译器为什么可以定义T[]m数组类型

  • 实现/扩展泛型接口/类的内部类可以是非泛型的吗


  • 在第二个示例中,您处理的是两个不同类型的变量。外部类和内部类各自定义了一个变量
    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
    。这将让您专注于核心算法,但免费为您提供所有样板方法。

    您将类型变量命名为类似的de>ArrayIterator的
    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