Java 泛型类型利用率

我有这些课程:


我的问题是,对于每个类,我都必须手动注册节点。


/**

 * 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 抽象类的快捷方式?


我在这里找不到任何有用的东西


茅侃侃
浏览 129回答 1
1回答

largeQ

您可以通过以下方式做得更好:public abstract class MessageEncoder<T extends Message> {&nbsp; &nbsp; protected MessageEncoder(Class<? extends T> messageClass) {&nbsp; &nbsp; &nbsp; GameConstants.RELEASE.register(messageClass, this);&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Get the encoded message to send to the client.&nbsp; &nbsp; &nbsp;*&nbsp;&nbsp; &nbsp; &nbsp;* @param message The message.&nbsp; &nbsp; &nbsp;* @return the {@link GamePacket} ready to be sent.&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public abstract GamePacket encode(T message);}现在子类会做:public final class ComponentMessageEncoder extends MessageEncoder<ComponentTextMessage> {&nbsp; &nbsp; ComponentMessageEncoder() {&nbsp; &nbsp; &nbsp; super(ComponentTextMessage.class);&nbsp; &nbsp; }&nbsp; &nbsp; // etc as before}这稍微减少了重复,它允许编译器阻止你出错,所以这是一个胜利。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java