如何在 java 中将通用函数参数设为 protobuf?
how can i make Generic function's params as protobuffer in java?
我想做一个函数来处理不同类型的protocal buffer变量,这些都需要调用protobuffer的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 class 扩展了类型 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
方法; ==
returns 如果字符串具有相同的内容但是是 String
class.
的不同实例则为 false
我想做一个函数来处理不同类型的protocal buffer变量,这些都需要调用protobuffer的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 class 扩展了类型 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
方法; ==
returns 如果字符串具有相同的内容但是是 String
class.