如何在 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