Java Generics,为什么在泛型中使用继承是非法的?

net*_*ain 4 java generics

我有这个结构:

///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;
 }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是泛型不喜欢,MovementStrategy<Creep>但它确实接受MovementStrategy<Movable<Position2D>>我认为奇怪的Creep扩展Movable<Position2D>.这在方法的上下文public MovementStrategy<Creep> getMovementStrategy()public MovementStrategy<Creep> getMovementStrategy()

这不可能吗?或者也许我做错了什么?

任何帮助表示赞赏!

编辑

忘了包括MovementStrategy来源.. doh!

Boz*_*zho 10

可能你甚至不需要泛型MovementStrategy.尽量不要创建那么多的泛型复杂性.


原始答案:您可以使用extends关键字:MovementStrategy<? extends Movable>

这是为了保持编译时的安全性.

试想一下,以下是可能的:Creep extends Movable,Wind extends Movable

MovementStrategy<Movable> strategy = new MovementStrategy<Wind>();
strategy.setTargetObject(new Creep()); //fails
Run Code Online (Sandbox Code Playgroud)

第二个喜欢在运行时失败,因为它期望Wind,但是你给它一个Creep