假设我在可迭代对象上有一些包装类。包装器本身也是可迭代的,将功能提升一级。
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的类型擦除有关,但仍然无法弄清楚如何实现这种简单的模式。
答案 0 :(得分:0)
您如何声明wrapper
?
必须是这样的:
Wrapper<InnerObject> wrapper = new Wrapper<>(obj);
或者像这样:
Wrapper<ObjectField> wrapper = new Wrapper<>(obj);
你可能会这样做:
Wrapper wrapper = new Wrapper(obj);