提问人:Codifier 提问时间:10/25/2020 更新时间:10/25/2020 访问量:398
避免使用返回实现策略模式的泛型对象的工厂的原始类型警告
Avoid raw type warnings with a factory that returns a generic object implementing a strategy pattern
问:
我的目标是拥有一个抽象类,其构造函数接受适用于派生类的抽象类。这个抽象类将实现适用于所有实现的泛型方法。你可以把 看作是实现一种策略模式,将方法委托给该模式。Game
GameEngine
Game
Game
Game
GameEngine
Game
因此,在使用 a 创建 时,我不在乎工厂返回什么实现。我只想确保使用适当的实现来构建实现。但是,如果我只是从工厂返回原始类型,我当然会收到警告。Game
GameFactory
Game
Game
GameEngine
Game
Raw use of parameterized class 'Game'
此外,理想情况下,该方法不必传递类型,而只是根据 的某些属性推断类型。GameFactory.createGame(settings)
settings
这是我所拥有的代码的要点:
public abstract class GameEngine<T extends Game<T>> {
public void doSomethingAllEnginesUnderstand(T game);
}
public class LocalGameEngine
extends GameEngine<LocalGame> {
}
public class RemoteGameEngine
extends GameEngine<RemoteGame> {
}
public abstract class Game<T extends Game<T>> {
private final GameEngine<T> gameEngine;
protected Game(GameEngine<T> gameEngine) {
this.gameEngine = gameEngine;
}
protected abstract T getSelf();
public final void doSomethingAllEnginesUnderstand() {
gameEngine.doSomethingAllEnginesUnderstand(getSelf());
}
}
public class LocalGame
extends Game<LocalGame> {
public LocalGame(LocalGameEngine gameEngine) {
super(gameEngine);
}
@Override
protected LocalGame getSelf() {
return this;
}
}
public class RemoteGame
extends Game<RemoteGame> {
public RemoteGame(RemoteGameEngine gameEngine) {
super(gameEngine);
}
@Override
protected RemoteGame getSelf() {
return this;
}
}
public class GameFactory {
// returns raw type Game
public Game createGame(GameSettings settings) {
if(settings.totalPlayers() > 1) {
return new RemoteGame(new RemoteGameEngine());
}
else {
return new LocalGame(new LocalGameEngine());
}
}
}
我是否滥用/误解泛型来达到我既定的目标?是否可以不创建泛型类,同时仍然强制将适当的实现传递给构造函数?Game
GameEngine
答:
我觉得你过度使用泛型,我发现矫枉过正。我会这样设计它:Game<T extends Game<T>>
make 和 extends(无泛型类型)。在以下情况下使用 polymorphysm:
LocalGame
RemoteGame
Game
@Override
getSelf
public class LocalGame extends Game { public LocalGame(LocalGameEngine gameEngine) { super(gameEngine); } @Override protected LocalGame getSelf() { return this; } }
public class RemoteGame extends Game { public RemoteGame(RemoteGameEngine gameEngine) { super(gameEngine); } @Override protected RemoteGame getSelf() { return this; } }
Make 和 extends(无泛型类型)
LocalGameEngine
RemoteGameEngine
GameEngine
// actuyally, this abstract class can be an interface instead public abstract class GameEngine { public void doSomethingAllEnginesUnderstand(Game game) {} }
public class LocalGameEngine extends GameEngine { }
public class RemoteGameEngine extends GameEngine { }
make require any subclass of ,泛型部分只能在构造函数中使用,不需要制作整个泛型()。
Game
GameEngine
Game
Game<T>
public abstract static class Game { private final GameEngine gameEngine; protected <T extends GameEngine> Game(T gameEngine) { this.gameEngine = gameEngine; } protected abstract Game getSelf(); public final void doSomethingAllEnginesUnderstand() { gameEngine.doSomethingAllEnginesUnderstand(getSelf()); } }
整体变得简单:
GameFactory
public Game createGame(GameSettings settings) { if (settings.totalPlayers() > 1) { return new RemoteGame(new RemoteGameEngine()); } else { return new LocalGame(new LocalGameEngine()); } }
评论
getSelf()
GameEngine
Game
GameEngine
Game
上一个:将原始流收集到类型化集合中?
评论
Game<?>
Promise
Inferred type 'Game<capture<? extends Game<?>>>' for type parameter 'T' is not within its bound; should extend 'Game<Game<capture<? extends Game<?>>>>'
Game
getSelf()
getSelf()
GameEngine
Game
getSelf()