gpt4 book ai didi

Java 泛型类型利用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:07:48 25 4
gpt4 key购买 nike

我有这些类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com