给出以下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)
这是该问题的另一种“观点”:
我们可以看到Java端期望将隐式TypeTag
作为方法的实际形式参数。显然,scala会自动执行此操作。 。如何在Java端获得等效结果?
我不知道如何在scala上使java调用此结构。任何提示表示赞赏。