我有这个结构:

///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 MovableWind extends Movable

MovementStrategy<Movable> strategy = new MovementStrategy<Wind>();
strategy.setTargetObject(new Creep()); //fails

第二个赞在运行时失败,因为它期望Wind,但是您给它一个蠕变

10-02 11:05