如何在 Java 中将泛型函数的参数作为原型缓冲区?



我想做一个函数来处理不同类型的原生缓冲区变量,这些变量都需要调用原生缓冲器的 api 函数。 代码如下:

public <T > void Send(T s) {
if (mode == "PUB") {
sock.send(s.toByteArray(), 0);   // error here, toByteArray is an api function in protocal buffer
} else if (mode == "REQ") {
sock.send(s.toByteArray(), 0); 
byte[] rs = sock.recv(0);
System.out.println("recv ack " + Arrays.toString(rs));
} else {
System.out.println("Unknown mode " + mode);
System.exit(1);
}   
}
public <T> void Recv(T t) throws InvalidProtocolBufferException {
if (m_mode == "SUB") {
t = T.parseFrom(m_sock.recv()); // error here
} else if (m_mode == "REP") {
T er = T.parseFrom(m_sock.recv());
m_sock.send(er.getReqid());
return er; 
} else {
System.out.println("Unknown mode " + m_mode);
System.exit(1);
return T.parseFrom(m_sock.recv());
}   
}

这对我不起作用,bc s.toByteArray(( 和 T.parseFrom(( 找不到,任何人都可以帮忙吗? 我是一名 c++ 开发人员,最近学习 java,java 可以支持泛型函数,并根据我的函数声明处理泛型参数吗? 谢谢

所有生成的protobuf类都扩展了类型com.google.protobuf.GeneratedMessage并且该类型具有方法toByteArray(它继承自com.google.protobuf.AbstractMessageLite(

只需将您的方法声明为 :

public void Send(com.google.protobuf.GeneratedMessage s) {

public void Send(com.google.protobuf.AbstractMessageLite s) {

您不需要泛型 - 您可以依赖继承类型层次结构。

另请注意:永远不要像在发布的代码中那样将字符串与 Java 中的==进行比较。请改用equals方法; 如果字符串具有相同的内容,但是String类的不同实例,则==返回 false。

最新更新