我有这个结构:
///Creep.java///
public interface Creep extends Movable<Position2D> {
...
}
///Movable.java///
public interface Movable<T extends Position2D> {
...
void setMovementStrategy(MovementStrategy<Movable<T>> movementStrategy);
MovementStrategy<Movable<T>> getMovementStrategy();
}
///MovementStrategy.java///
public interface MovementStrategy<T extends Movable<? extends Position2D>> {
void executeMovement(T movable);
}
///CreepImpl.java///
public class CreepImpl implements Creep {
...
@Override
public void setMovementStrategy(MovementStrategy<Creep> movementStrategy) {
// TODO Auto-generated method stub
}
@Override
public MovementStrategy<Creep> getMovementStrategy() {
return null;
}
}
我的问题是,泛型不喜欢
MovementStrategy<Creep>
,但它确实接受MovementStrategy<Movable<Position2D>>
,我认为这很奇怪,因为Creep
扩展了Movable<Position2D>
。这在public MovementStrategy<Creep> getMovementStrategy()
和public MovementStrategy<Creep> getMovementStrategy()
方法的上下文中这不可能吗?还是我做错了什么?
任何帮助表示赞赏!
编辑
忘了包括MovementStrategy来源。
最佳答案
也许您甚至不需要带有MovementStrategy
的泛型。尽量不要创建太多的泛型复杂性。
原始答案:您可以使用extends
关键字:MovementStrategy<? extends Movable>
这是维护编译时安全所必需的。
想象以下可能:Creep extends Movable
,Wind extends Movable
MovementStrategy<Movable> strategy = new MovementStrategy<Wind>();
strategy.setTargetObject(new Creep()); //fails
第二个赞在运行时失败,因为它期望Wind,但是您给它一个蠕变