从Java覆盖Scala方法时的TypeTag推断

时间:2019-08-08 23:22:42

标签: scala scala-java-interop

给出以下scala基类:

trait P2pRpc {

  import reflect.runtime.universe.TypeTag

  def request[U: TypeTag, V: TypeTag](req: P2pReq[U]): P2pResp[V]

}

P2p类在哪里:

abstract class P2pMessage[T] extends _root_.java.io.Serializable {
  def value(): T
}

abstract class P2pReq[T] extends P2pMessage[T] with _root_.java.io.Serializable


abstract class P2pReq[T] extends P2pMessage[T] with _root_.java.io.Serializable

并给出以下简单的Java类:

  public static class ExecuteAppCommandReq extends P2pReq<String> {
    public String value;

    public ExecuteAppCommandReq(String value) {
      this.value = value;
    }
  }

  public static class ExecuteAppCommandResp extends P2pResp<String> {
    public String value;

    public ExecuteAppCommandResp(String value) {
      this.value = value;
    }
  }

以下是尝试从Java覆盖P2pRpc.request()方法的方法:

 public ExecuteAppCommandResp executeAppCommand(ExecuteAppCommandReq req) {
    return (ExecuteAppCommandResp) getRpc().request(req);
  }

但这不起作用:

Error:(19, 44) java: method request in interface com.pointr.tcp.rpc.P2pRpc cannot be applied to given types;
  required: com.pointr.tcp.rpc.P2pReq<U>,scala.reflect.api.TypeTags.TypeTag<U>,scala.reflect.api.TypeTags.TypeTag<V>
  found: com.pointr.tcp.java.sparcle.AppContainerService.ExecuteAppCommandReq
  reason: cannot infer type-variable(s) U,V
    (actual and formal argument lists differ in length)

注意:TypeTag被折叠到request()方法的参数2和参数3中。

 reason: cannot infer type-variable(s) U,V
       (actual and formal argument lists differ in length)

这是该问题的另一种“观点”:

enter image description here

我们可以看到Java端期望将隐式TypeTag作为方法的实际形式参数。显然,scala会自动执行此操作。 。如何在Java端获得等效结果?

我不知道如何在scala上使java调用此结构。任何提示表示赞赏。

0 个答案:

没有答案