2016-04-21 50 views
2

我有這樣一個方法:如何在Java中調用參數化方法?

private static <T extends HomerMessage> HomerMessage postRequest(String path, HomerMessage json) throws IOException, HomerDoh 
{ 
    RequestBody body = RequestBody.create(JSON, toJson(json)); 
    Request request = new Request.Builder().url("http://" + path).post(body).build(); 

    String response = new OkHttpClient().newCall(request).execute().body().string(); 
    System.out.println(response); 
    JsonNode responseNode = new ObjectMapper().readValue(response, JsonNode.class); 
    if(!"200".equals(responseNode.get("status"))) 
    { 
     throw readData(response, new TypeReference<HomerDoh>() {}); 
    } 
    return readData(response, new TypeReference<T>() {}); 
} 

private static <T> T readData(String is, TypeReference<T> ref) throws IOException 
{ 
    return mapper.readValue(is, ref); 
} 

一切工作正常,但我無法弄清楚如何調用它... 我曾嘗試:

 AuthResponse ar = HomerClient.postRequest(url + "/api/v1/session", auth); 

最後一個表達式不編譯。

如何在Java中調用參數化方法?

AuthResponse延伸HomerMessage

+0

你會得到什麼錯誤? – SLaks

+4

順便說一句,那種方法是完全破碎的;它需要一個'TypeReference'作爲參數。 – SLaks

回答

2

您的代碼不編譯,因爲它沒有返回一個AuthResponse:它是返回HomerMessage

您可以返回類型AuthResponse如果你改變了方法的返回類型:

private static <T extends HomerMessage> T postRequest(
    String path, HomerMessage json, TypeReference<T> typeRef) 
     throws IOException, HomerDoh 

這是你唯一的常完成代碼路徑的返回類型。


正如@SLaks指出,你不能使用泛型TypeReference

new TypeReference<T>() {} 

因爲擦除的,這將在運行時等效於:

new TypeReference<Object>() {} 

這是幾乎肯定不是你想要的 - 否則你可能只是用過了,而且首先沒有調用泛型方法的問題。

實際上你需要在混凝土TypeReference作爲參數傳遞:

private static <T extends HomerMessage> T postRequest(
    String path, HomerMessage json, TypeReference<T> typeRef) 
     throws IOException, HomerDoh 

,那麼你可以把這個簡單的:

AuthResponse response = postRequest(
    url + "/api/v1/session", auth, 
    new TypeReference<AuthResponse>() {}); 

和類型T從第三個參數推斷。

+0

你還應該在'postRequest'方法的'throws'子句中用'T'替換'HomerDoh',並在調用'throw readData(response,typeRef)'時使用'typeRef''。否則,你的代碼將無法編譯。 – RZet

+0

@RZet你確定嗎?對我來說沒問題。 –

+0

很確定你會得到''未處理的異常類型T''編譯錯誤。這是'readData()'方法返回的類型。 – RZet

2

您需要提供類,其中定義了static方法的名稱:

Exception ar = SomeClass.<Exception>getException(); 
1

Exception ar = <Exception>getException();不能編譯,因爲泛型方法參數化成語需要一個類名的表達(或者如果方法不是靜態的,則爲變量名稱)。

例如:

Exception ar = MyClass.<Exception>getException(); 

對於實例方法:

  • Exception ar = theObject.<Exception>getException();
  • Exception ar = this.<Exception>getException();