如何解决此未选中的投射警告?

时间:2017-05-03 04:24:23

标签: java generics

这一行给了我未经检查的投射警告

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;
    }
}

我觉得这里有一个通用的流通问题,但代码工作正常。但是,可能有更好的方式来做我在这里做的事情。

1 个答案:

答案 0 :(得分: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 {
    ...
}

这使得一切都是类型安全的,并且警告已经消失。

您甚至可以在检索(U)

时删除显式广告game.getGameSocket()