【问题标题】:Custom Iterator returns Object自定义迭代器返回对象
【发布时间】:2020-04-28 18:23:38
【问题描述】:

我为 MyList 类编写了一个自定义迭代器,如下所示:

private class MyListIterator implements Iterator<ListItem> {
        // Constructor
        public MyListIterator() {
            nextElement = head;
        }

        @Override
        public ListItem next() {
        ...

    }

然后在 MyList 类中创建一个新的 MyListIterator,如下所示:

@Override
    public Iterator<ListItem> iterator() {
        MyListIterator iterator = new MyListIterator();
        return iterator;
    }

最后我尝试迭代一个 MyList 对象,期望 ListItems:

MyList list = new MyList();
for (ListItem item : list ) {
       System.out.println(item.value);
}

但我得到不兼容类型错误,因为迭代器返回 Object 类型而不是 ListItem。我该如何解决?

编辑:MyList 实现 MyListInterface

public interface MyListInterface<T extends Comparable<T>> extends Iterable<T> {
    public Iterator<T> iterator();
}

但我不能更改MyListInterface中的任何内容

private class ListItem {
        Comparable value;
        ListItem previous;
        ListItem next;

        public ListItem(Comparable value) {
            this.value = value;
        }
    }

【问题讨论】:

  • list.iterator() 呢?
  • MyList 是否实现 IterableIterable&lt;ListItem&gt;

标签: java generics iterator iterable


【解决方案1】:

我假设您错误地写了 MyList implements MyListInterface {,忘记添加通用参数。这意味着您使用的是原始类型,您应该这样做。见What is a raw type and why shouldn't we use it?

原始类型MyListInterface 具有原始类型Iterator 的超接口。一旦你使用了一种原始类型,所有相关类型都会变成原始类型(在JLS section 4.8 中了解更多信息),所以目前你的MyList 实现了非泛型Iterable,它返回一个非泛型Iterator,其next 方法返回Objects。要使MyList 实现Iterable&lt;ListItem&gt;,您需要编写

class MyList implement MyListIterator<ListItem> {

如果您的 ListItem 还不是 Comparable&lt;ListItem&gt;,请同时实施。

【讨论】:

    【解决方案2】:

    你的MyListimplements Iterable 而不是implements Iterable&lt;ListItem&gt;。编译器会就此向您发出警告;注意警告。

    在您的更新中,您应该使用implements MyListInterface&lt;ListItem&gt;。您实际上收到了我提到的警告(使用原始类型 MyListInterface)——这些警告旨在帮助您避免和解决此类问题。

    【讨论】:

    • MyList 正在实现另一个扩展 Iterable 的接口。我不允许更改界面中的任何内容,如何使其工作?
    • @LuccaBaumgärtner 你能也显示那部分代码吗?我们需要一个minimal reproducible example
    • 在练习中它说ListItem 应该是具有私有访问权限的 MyList 的子类,所以在实现MyListInterface 时我不能将它用作类型。我在问题中添加了ListItem。在实现MyListInterface 时,有没有办法通过使用泛型类型来完成这项工作
    • 你有 另一个 原始类型,它会给你一个警告。也许你应该有class ListItem&lt;T&gt; { T value; }MyList&lt;T extends Comparable&lt;T&gt;&gt; implements MyListInterface&lt;T&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2017-03-20
    • 2019-01-04
    相关资源
    最近更新 更多