Java 泛型类型利用

标签 java oop generics

我有这些类(class):

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

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

}

正如您在注册方法中看到的项目,我必须为我制作的每个编码器手动输入。

是否有一个快捷方式,我可以将其放入 MessageEncoder 抽象类中?

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

编辑:

在哪里注册签名。是:

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

最佳答案

你可以做得更好:

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
}

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

关于Java 泛型类型利用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51957127/

相关文章:

database - Swift - 在 View 之间花费大量数据 : create objects in the first view or connectar several times in the database?

generics - 我可以从化T创建KType吗

java - 如何确保 Java 中的 hashcode() 不会解析为相同的值?

Scala:通过 Reader 和兼容性进行依赖注入(inject)

java - 当我尝试将项目添加到集合时出现 ConcurrentModificationException

c++ - Qt 的简单版本检查器

typescript - Typescript 中返回类型的通用映射

Where子句的C#代码混淆

java - repaint() 方法不重新绘制 JPanel

java - 如何多次运行 TestNG 套件