gpt4 book ai didi

java - 接口(interface)中的通用方法返回未检查的强制转换

转载 作者:行者123 更新时间:2023-11-29 04:33:09 25 4
gpt4 key购买 nike

所以我有一系列相关接口(interface),其中一个包含其他 3 个接口(interface)(由 setter 和 getter 强制执行)。

enter image description here

虽然此接口(interface)的实例在被管理(从映射中存储和检索)时可以仅作为接口(interface)契约保留;当他们到达一个处理 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 中使用它们时,不需要将它们强制转换为接口(interface)的适当实现。

当在返回类型中进行强制转换时抛出未经检查的强制转换时会出现问题。我不知道如何处理这样的警告。我的意思是我将 gameDataIO 设置为 Game 数据类型并且返回应该是 GameData 类型。为什么警告?我尝试了所有类型的转换,到目前为止,唯一可以在没有警告的情况下工作的转换是将预期的类作为参数传递,然后使用 type.cast(returnedObject)。

任何提示将不胜感激。

最佳答案

当你的接口(interface)像这样定义泛型方法时:

<G extends GameData> G getGameData();

编译器知道 <G>必须扩展或实现 GameData ,但确切的实现G表示将在调用 getGameData() 的代码站点进行推断方法。

当你实现那个方法时:

@Override
public <G extends GameData> G getGameData() {
return (G) gameDataIO;
}

您的实现对任何潜在的调用站点一无所知。它应该返回调用者所需的特定子类型(G),但它不能。您正在转换,但编译器无法验证它是否安全(因为它不是),因此您收到一个未检查警告。

假装写了一个类 MyGameData extends GameData并在我的代码中写下:

IState<?> state = ... // TODO
MyGameData mgd = state.getGameData();

在这种情况下,<G>绑定(bind)到特定类型 MyGameData ,它满足您的 API 要求,它必须继承自 GameData .但是随后您的代码返回一个普通的 GameData 不是 我的特定子类 并在运行时导致 ClassCastException。

大多数其他方法也是如此。返回基类型(GameData 等)使 getter 等成为泛型方法或者您必须添加类型参数 G , GS , 和 PIState接口(interface)而不是基于每个方法。


根据此评论编辑添加:

GameData, Player and other are interfaces whose implementations are injected by Spring on start. So I have interfaces just to ensure basic functionalities, but the implemented classes need to be known by the processor. I did a first version without generics, but I ended doing tons of type casting making the code unreadable.

您描述的是紧耦合系统的症状。 Interfaces are a tool用于定义松耦合系统,因为这些通常被认为是更好的设计。我鼓励您考虑为什么在您的设计中处理器需要如此了解其他接口(interface)的实现类型。是因为接口(interface)本身没有完全描述该接口(interface)的实现所需的功能行为吗?

关于java - 接口(interface)中的通用方法返回未检查的强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com