Java泛型作为参数
本文关键字:参数 泛型 Java | 更新日期: 2023-09-27 17:52:33
所以我有一堆方法,它们本质上进行相同的调用——唯一的区别是泛型的类名。示例:
当前:
public void methodA(ARequest request, ADelegate delegate)
{
JsonClient<ARequest, AResponse> client = new JsonClient<ARequest, AResponse>(request.ServiceServerUrl, request, new AResponse());
client.sendRequest(delegate);
}
public void methodB(BRequest request, BDelegate delegate)
{
JsonClient<BRequest, BResponse> client = new JsonClient<BRequest, BResponse>(request.ServiceServerUrl, request, new BResponse());
client.sendRequest(delegate);
}
我想做的是:
private void serviceCall<R extends RequestBase, S extends ResponseBase>(ADelegate delegate)
{
JsonClient<R, S> client = new JsonClient<R, S>(request.ServiceServerUrl, request, new AResponse());
client.sendRequest(delegate);
}
public void methodA(ARequest request, ADelegate delegate)
{
serviceCall<ARequest, AResponse>(delegate);
}
public void methodB(BRequest request, BDelegate delegate)
{
serviceCall<BRequest, BResponse>(delegate);
}
我认为这在C#中是可能的,但我只想知道如何在Java中正确地做到这一点。
编辑:为了清晰起见。
您应该能够编写以下内容:
private <R extends RequestBase, S extends ResponseBase> void serviceCall(
R request,
S response,
ADelegate delegate
) {
JsonClient<R, S> client = new JsonClient<R, S>(request.ServiceServerUrl, request, response);
client.sendRequest(delegate);
}
注意,调用者必须实例化并传入response
,因为类似new S()
的东西在Java:中是不可能的
public void method(ARequest request, ADelegate delegate) {
serviceCall(request, new AResponse(), delegate);
}
类似的东西
MyClass.<ARequest, AResponse>serviceCall(request, new AResponse(), delegate)
这里没有必要,因为编译器会为您推断类型参数。
你的意思是?
public <T extends RequestBase, E extends ResponseBase> void method(T request, E delegate)
{
JsonClient<T, E> client = new JsonClient<T, E>(request.ServiceServerUrl, request, new AResponse());
client.sendRequest(delegate);
}
并像CCD_ 3一样调用它。