为了账号安全,请及时绑定邮箱和手机立即绑定

Java 泛型类型利用率

Java 泛型类型利用率

茅侃侃 2021-08-04 17:17:14
我有这些课程:我的问题是,对于每个类,我都必须手动注册节点。/** * Contains the encoder for messages from the server. *  * @since 18/08/2018 */public abstract class MessageEncoder<T> {    /**     * Register this encoder to a message.     */    public abstract void register();    /**     * Get the encoded message to send to the client.     *      * @param message The message.     * @return the {@link GamePacket} ready to be sent.     */    public abstract GamePacket encode(T message);}其中 < T > 总是 someClass 扩展消息。这是消息编码器的样子:public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {    @Override     public void register() {        GameConstants.RELEASE.register(ComponentTextMessage.class, this);    }    @Override     public GamePacket encode(ComponentTextMessage message) {        // TODO Auto-generated method stub        return null;    }}正如您在 register 方法中看到的那样,我必须为我制作的每个编码器手动输入这些内容。是否有我可以将其放入 MessageEncoder 抽象类的快捷方式?我在这里找不到任何有用的东西
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

您可以通过以下方式做得更好:


public abstract class MessageEncoder<T extends Message> {

    protected MessageEncoder(Class<? extends T> messageClass) {

      GameConstants.RELEASE.register(messageClass, this);

    }


    /**

     * Get the encoded message to send to the client.

     * 

     * @param message The message.

     * @return the {@link GamePacket} ready to be sent.

     */

    public abstract GamePacket encode(T message);

}

现在子类会做:


public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {

    ComponentMessageEncoder() {

      super(ComponentTextMessage.class);

    }


    // etc as before

}

这稍微减少了重复,它允许编译器阻止你出错,所以这是一个胜利。


查看完整回答
反对 回复 2021-08-04
  • 1 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信