使用嵌套泛型和继承编译错误



我无法找到解决问题的方法。在这两种情况下,我都得到一个编译错误。有什么帮助可以使其工作吗?

案例1:

public class Entity<T extends EntityHandler<Entity>> {
    protected T handler;
    public void remove() {
        for (Entity entity : handler.getEntities()) {
            // do stuff
        }
        handler.saveEntity(this);
    }
}
public class Player<T extends PlayerHandler<Player>> extends Entity</*error here*/T> {}
public class EntityHandler<T extends Entity> {
    private List<T> entities;
    public void saveEntity(T entity) {
        // do stuff
    }
    public List<T> getEntities() {
        return entities;
    }
}
public class PlayerHandler<T extends Player> extends EntityHandler<T> {}

错误:类型参数 T 不在类型变量 T 的范围内

案例2:

public class Entity<T extends EntityHandler<? extends Entity>> {
    protected T handler;
    public void remove() {
        for (Entity entity : handler.getEntities()) {
            // do stuff
        }
        handler.saveEntity(/*error here*/this);
    }
}
public class Player<T extends PlayerHandler<? extends Player>> extends Entity<T> {}
public class EntityHandler<T extends Entity> {
    private List<T> entities;
    public void saveEntity(T entity) {
        // do stuff
    }
    public List<T> getEntities() {
        return entities;
    }
}
public class PlayerHandler<T extends Player> extends EntityHandler<T> {}

错误:不兼容的类型:无法将实体转换为捕获 #1 的 ? 扩展实体

问题:为什么增强的 for 循环会编译并且不会抛出类似于上述的编译错误?

在第一种情况下,您在错误的位置标记了错误。它在这里:

public class Player<T extends PlayerHandler<Player>> extends Entity<T //here> {}

错误:(20, 73) java:类型参数 T 不在类型变量 T 的范围内

这很容易 - Entity只能使用扩展EntityHandler的类进行参数化。

在第二种情况下,您的for由于擦除而编译,因此基本上getEntities只返回某些内容的列表。

至于saveEntity错误,您正在尝试传递capture<? extends Entity但方法期望具有 Entity<T> ,这是不允许的。

我将案例 1 中的代码更改为

public class Entity<T extends EntityHandler<Entity>> {
protected T handler;
public void remove() {
    for (Entity entity : handler.getEntities()) {
        // do stuff
    }
    handler.saveEntity(this);
}
}

public class EntityHandler<T extends Entity> {
private List<T> entities;
public void saveEntity(T entity) {
    // do stuff
}
public List<T> getEntities() {
    return entities;
}
}
public class PlayerHandler<T extends Player> extends EntityHandler</*error here*/T> {}
public class Player<T extends PlayerHandler<?>> extends Entity<EntityHandler<Entity>>{}

并且我没有收到编译器错误或警告。在 Eclipse 版本中工作:Juno Service Release 2 和 JavaSE-1.7。

最新更新