【发布时间】:2017-03-22 23:38:59
【问题描述】:
所以我有一系列相关的接口,其中一个包含其他 3 个(由 setter 和 getter 强制执行)。
虽然此接口的实例可以在管理(从地图中存储和检索)时保留为接口合同;当他们到达一个处理 bean 时,他们需要能够将他们自己显示为他们所实现的类。
所以我能够做到以下几点:
public interface IState<S extends IState> {
<G extends GameData> G getGameData();
<G> S setGameData(G gameDataIO);
<P> P getPlayer();
<P> S setPlayer(P player);
<GS> GS getGameState();
<GS> S setGameState(GS gameState);}
默认实现:
public class DefaultStateNG implements IStateNG<DefaultStateNG> {
private GameData gameDataIO;
private IPlayerState player;
private IGameState gameState;
@Override
public <G extends GameData> G getGameData() {
return (G) gameDataIO;
}
@Override
public <G> DefaultStateNG setGameData(G gameDataIO) {
this.gameDataIO = (GameData) gameDataIO;
return this;
} //..... other accessor methods implemented
因此,当我在处理器 bean 中使用它们时,不需要将它们强制转换为接口的适当实现。
当在返回的类型中强制转换时抛出未经检查的强制转换,就会出现问题。我不知道如何处理这样的警告。我的意思是我将 gameDataIO 设置为 Game 数据类型,并且返回应该是 GameData 类型。为什么警告?我尝试了各种类型的转换,到目前为止唯一没有警告的情况是将预期的类作为参数传递,然后使用 type.cast(returnedObject)。
任何提示将不胜感激。
【问题讨论】:
-
我认为您不想在这里使用泛型。如果您想使用来自不同树的类而不使用它们的组合父级(最坏情况下的对象),则使用泛型。在这里,你只想拥有 GameData、Player 等。
-
GameData、Player等是Spring启动时注入实现的接口。所以我有接口只是为了确保基本功能,但实现的类需要处理器知道。我做了第一个没有泛型的版本,但最后我做了大量的类型转换,使代码不可读。
标签: java spring generics interface casting