【问题标题】:Java Generic Type utilisationJava 泛型类型利用
【发布时间】:2018-08-21 21:46:13
【问题描述】:

我有这些课程:

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

/**
 * 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);

}

总是 someClass extends Message.

下面是消息编码器的样子:

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 抽象类?

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

编辑:

在哪里注册 sig。是:

/**
     * The encoders.
     */
    private final Map<Class<? extends Message>, MessageEncoder<?>> encoders = new HashMap<>();

    /**
     * Register a encoder to a message.
     * 
     * @param message The message.
     * @param encoder The encoder.
     */
    public void register(Class<? extends Message> message, MessageEncoder<?> encoder) {
        encoders.put(message, encoder);
    }

【问题讨论】:

  • GameConstants.RELEASE.register()的签名是什么?
  • 它正在填充地图 ,消息编码器>
  • 方法签名是什么?
  • 你必须得到T.class,当不能直接获取时,见stackoverflow.com/questions/3437897
  • @shmosel 编辑操作

标签: java oop generics


【解决方案1】:

你可以做得更好:

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
}

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

【讨论】:

  • 我认为ComponentMessageEncoder 构造函数应该传递给super 一个对ComponentTextMessage.class 的引用而不是ComponentMessageEncoder.class。不是吗?
  • 您需要确保T extends Message。您还需要传递消息类型,而不是编码器类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多