簡體   English   中英

Java泛型作為參數

[英]Java Generics as parameters

所以我有一堆基本上可以進行相同調用的方法,唯一的區別是泛型的類名。 例:

當前:

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 ,因為Java中不可能使用new S()

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);
}

並像ClassName.<ARequest, AResponse>method(request, response)一樣調用它ClassName.<ARequest, AResponse>method(request, response)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM