我有这个结构:
///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
归档时间: |
|
查看次数: |
265 次 |
最近记录: |