【问题标题】:How do I resolve this Unchecked cast warning?如何解决此未经检查的演员表警告?
【发布时间】:2017-05-03 04:24:22
【问题描述】:

这一行给了我未经检查的演员表警告

this.gameSocket = (U) game.getGameSocket();

SocketHandler.java:

public class SocketHandler<T extends Game, U extends GameSocket> extends 
Listener
{
    protected T game;
    protected U gameSocket;

    public SocketHandler(T game)
    {
        this.game = game;
        this.gameSocket = (U) game.getGameSocket();
    }
}

Game.java:

public class Game<T extends GameSocket>
{
    protected T gameSocket;

    public T getGameSocket()
    {
        return gameSocket;
    }

    public Game()
    {

    }
}

GameSocket.java:

public class GameSocket<T extends Game>
{
    protected T game;
    protected int port;

    public GameSocket(T game, int port)
    {
        this.game = game;
        this.port = port;
    }
}

我觉得这里似乎存在一般流通问题,但代码运行良好。但是,可能有更好的方法来做我在这里做的事情。

【问题讨论】:

  • 那么,你的游戏有socket,同时socket也有游戏,对吧?
  • 是的,正确。由于彼此之间的可靠性,它们具有一对一的关系。
  • 你能解释一下为什么GameGameSocket 似乎有循环依赖关系吗?
  • 游戏会调用socket的哪些方法,socket会调用游戏的哪些方法?
  • 我使用套接字中的游戏类来处理来自客户端的数据包并对其进行处理。套接字类需要引用游戏类才能做到这一点。游戏类需要引用的socket类来初始化socket并绑定。

标签: java generics


【解决方案1】:

你有一个泛型循环:GameSocket 的泛型类型扩展了 Game,但 Game 的泛型类型扩展了 GameSocket!

要解决这个问题,我建议将GameSocket 的类声明更改为:

public class GameSocket<T> {
    ...
}

然后,您可以将Game的类声明更改为:

public class Game<T extends GameSocket<T>> {
    ...
}

最后,您可以将SocketHandler的类声明更改为:

public class SocketHandler<T extends Game<U>, U extends GameSocket<U>> extends Listener {
    ...
}

这使得所有内容都是类型安全的,并且警告消失了。

您甚至可以在检索 game.getGameSocket() 时删除显式转换 (U)

【讨论】:

  • 这确实解决了循环依赖的问题,由于过于复杂,我已经改变了设计模式。但是,将来如果我需要对泛型有循环依赖,我总是可以跟进这个解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多