繁体   English   中英

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

[英]Compile error using nested generics and inheritance

我无法找到解决问题的方法。 在这两种情况下,我都会遇到编译错误。 有什么帮助使它工作?

情况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:type参数T不在类型变量T的范围内

而且它非常简单 - Entity只能通过扩展EntityHandler类进行参数EntityHandler

在第二种情况下,你for编译是因为擦除 ,所以基本上getEntities只返回一些东西。

至于saveEntity错误,你试图传递capture<? extends Entity 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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM