我无法找到解决问题的方法。在这两种情况下,我都会遇到编译错误。有什么帮助才能让它发挥作用?
案例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循环编译并且它不会抛出类似于上面的编译错误?
答案 0 :(得分:2)
在第一种情况下,您在错误的位置标记了错误。就在这里:
public class Player<T extends PlayerHandler<Player>> extends Entity<T //here> {}
错误:(20,73)java:type参数T不在类型变量T
的范围内
这很容易 - Entity
只能使用扩展EntityHandler
的类进行参数化。
在第二种情况下,由于erasure,您的for
会进行编译,因此基本上getEntities
只会返回某些内容列表。
至于saveEntity
错误,您尝试传递capture<? extends Entity
,但方法需要Entity<T>
,这是不允许的。
答案 1 :(得分:0)
我将案例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。