【发布时间】: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