【问题标题】:Implementation of Collection and Iterator interface as inner classCollection 和 Iterator 接口作为内部类的实现
【发布时间】:2016-09-17 15:52:31
【问题描述】:

我正在尝试使用 Iterator 作为内部类来实现 Collection 接口。实现集合的 ArrayCollection 类有一个泛型数组(说类成员是泛型的是否正确?)。 a screenshot from IDE

public class ArrayCollection<T> implements Collection<T> {
private T[] m = (T[])new Object[10];

但是,当我为 Iterator 接口实现方法 next() 时,我不断收到 Incompatible types 错误。但是,如果将 ArrayIterator 设为非泛型类编译器,则数组类型转换不再存在问题。 an error screenshot from IDE

    private class ArrayIterator<T> implements Iterator<T> {
    private int cursor = 0;

    @Override
    public boolean hasNext() {
        return this.cursor >= ArrayCollection.this.size();
    }

    @Override
    public T next() {
       return ArrayCollection.this.m[cursor++];
    }
}

所以我有几个问题:

  1. 如果我将 ArrayIterator 设为非泛型,编译器怎么能定义 T[] m 数组类型?

  2. 是否只有实现/扩展泛型接口/类的内部类可以是非泛型的?

【问题讨论】:

  • 你能在这里分享代码吗?
  • 添加了代码。还有来自IDE的链接截图。我的堆栈溢出评分太低,无法直接将图像添加到问题中。
  • 从不添加图片,添加代码
  • 不应该hasNext()方法使用&lt;,而不是&gt;=吗? --- 您还应该在 next() 中再次检查以正确抛出 NoSuchElementException 而不是当前将发生的 ArrayIndexOutOfBoundsException

标签: java generics data-structures collections types


【解决方案1】:

您以类似方式命名类型变量,ArrayIterator&lt;T&gt;TArrayCollection&lt;T&gt;T 不同。

您可以从ArrayIterator 中删除&lt;T&gt;(因为它是一个非静态内部类),然后让Iterator 使用父类中的T

    private class ArrayIterator implements Iterator<T> {

这将修复编译问题和您的代码。

【讨论】:

    【解决方案2】:

    在第二个示例中,您正在处理两个不同类型的变量。外部类和内部类各自定义了一个变量T,但它们并不相同。有几种方法可以解决这个问题,一种是从内部类声明中删除 T:

    private class ArrayIterator implements Iterator<T> {
    

    现在您只引用外部 T,而不引入单独的内部 T

    但是,我个人更喜欢将内部类设为静态,在这种情况下,您不能使用外部类型的变量。在这种情况下,你会写

    private static class ArrayIterator<T> implements Iterator<T> {
    

    如果这样做,则需要将类型变量从外部类型传递给内部:

    return new ArrayIterator<T>();
    

    主要区别在于定义类型参数的类会隐藏任何现有的同名类型参数,这会导致出现奇怪的错误消息。

    最后让我补充一点,从头开始实现 Collection 通常不是一个好主意。相反,您可能想要扩展 AbstractCollectionAbstractList。这将使您专注于您的核心算法,但免费为您提供所有样板方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 2022-08-03
      • 2012-01-04
      相关资源
      最近更新 更多