【问题标题】:Parameterize iterable wrapper in Java: incompatible types error在 Java 中参数化可迭代包装器:不兼容的类型错误
【发布时间】:2014-09-15 08:35:09
【问题描述】:

假设我在一个可迭代对象上有一些包装类。包装器本身也是可迭代的,将功能提升了一级。

public class Wrapper implements Iterable<ObjectField> {

    private final InnerObject obj;

    Wrapper(InnerObject obj) {
        this.obj = obj;
    }

    @Override
    public Iterator<ObjectField> iterator() {
        return new FieldIterator(obj);
    }
}

ObjectField 是我的包装对象的内部字段,FieldIterator 被声明为

public class FieldIterator implements Iterator<ObjectField> {

    private final InnerObject obj;

    public FieldIterator(InnerObject obj) {
        this.obj = obj;
    }

    @Override
    public boolean hasNext() {
        return obj.hasNext();
    }

    @Override
    public ObjectField next() {
        return obj.next();
    }

    @Override
    public void remove() { obj.remove();  }
}

并且包装器在代码中的某处使用如下

for (ObjectField f : wrapper) {
    // some code
}

现在我想用 InnerObject 类的后代参数化包装器:

public class Wrapper<T extends InnerObject> implements Iterable<ObjectField> {

    private final T obj;

    Wrapper(T obj) {
        this.obj = obj;
    }

    @Override
    public Iterator<ObjectField> iterator() {
        return new FieldIterator(obj);
    }
}

但是当我这样做时,客户端代码

for (ObjectField f : wrapper)

停止编译,说:

不兼容的类型。必需:ObjectField,找到:java.lang.Object

请原谅我的简单问题,因为我刚刚学习 Java。我怀疑这种行为与 Java 的类型擦除有关,但仍然无法弄清楚如何实现这个简单的模式。

【问题讨论】:

    标签: java iterable incompatibletypeerror


    【解决方案1】:

    你如何声明wrapper

    必须是这样的:

    Wrapper<InnerObject> wrapper = new Wrapper<>(obj);
    

    或者像这样:

    Wrapper<ObjectField> wrapper = new Wrapper<>(obj);
    

    你可能是这样做的:

    Wrapper wrapper = new Wrapper(obj);
    

    【讨论】:

    • 就是这么简单!我的错。非常感谢!
    猜你喜欢
    • 2023-03-04
    • 2014-01-30
    • 2015-07-03
    • 2012-07-17
    • 2020-05-20
    • 2022-11-29
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多