参数化Java中的可迭代包装:不兼容类型错误

时间:2014-09-15 08:35:10

标签: java iterable incompatibletypeerror

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

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,Found:java.lang.Object

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

1 个答案:

答案 0 :(得分:0)

您如何声明wrapper

必须是这样的:

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

或者像这样:

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

你可能会这样做:

Wrapper wrapper = new Wrapper(obj);