【发布时间】: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);
}
下面是消息编码器的样子:
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 编辑操作