簡體   English   中英

Java:無法理解方法語法

[英]Java : Couldn't understand method Syntax

我正在研究現有代碼。 在一個類中,我具有以下方法,具有以下語法:

public Response getData(Request serviceRequest, Class<? extends APIResponse> expectedResponseClass) 
{

}

我的問題是,我無法理解此方法的第二個參數。

有人可以告訴我,第二個參數是什么,我們應該如何理解?

謝謝!

修改為證明我們也可以將子類作為參數傳遞給期望超類的方法

超類

 public class Superclass {}

一個.java

public class One extends Superclass{}

Main.java

public class Main {
    public static void main(String args[]) {
        One one = new One();
        Main main = new Main();
        main.mainMethod(one);
    }

    public void mainMethod(Superclass sc) {
        System.out.println("Inside the Main Method");
    }

}

Class<? extends APIResponse> Class<? extends APIResponse>是有界通配符的示例。 這意味着它本身可以是APIResponse類型的類,也可以是它的某些子類。

如果改為使用Class<APIResponse> ,則只能在APIResponse類型的類上調用該方法,而不能在其APIResponse類型上調用該方法。

查看Wildcards教程以獲取更多信息。

第二個參數是Class類型的實例,該實例對應於APIResponse的子類(或APIResponse本身)。

請注意,此調用中沒有涉及APIResponse實例(或子類),就像您在某些注釋中所暗示的那樣。

那是Java泛型參數。 這意味着第二個參數應該是Class ,該類擴展了APIResponse

它表示第二個參數可以是APIResponse的任何子類。

如果該方法的參數類型為Class<APIResponse> ,則將指示其類型參數為APIResponseClass對象-而不是其任何子類。 Class對象的type參數是它表示的類。 換句話說,唯一有效的參數將是APIResponse類對象(或null )。

相比之下, Class<? extends APIResponse> Class<? extends APIResponse>指示其類參數為APIResponse 或其任何子類的 Class對象。 這意味着,如果您有APIResponse的子類(我將其稱為MyAPIResponse ),則可以將其類對象傳遞給此方法。 該對象的類型為Class<MyAPIResponse> ,它適合於Class<? extends APIResponse> Class<? extends APIResponse>

您可能想知道為什么會這樣。 為什么不能將Class<MyAPIResponse>對象放入Class<APIResponse>變量中? 答案是因為它會破壞Java的類型安全性。 這不是立即顯而易見的,並且我無法用Class來解釋它(該類沒有任何帶有類型的方法,具體取決於它的type參數),所以我將使用不同的泛型類給出一個示例: ArrayList 這里YourAPIResponse是另一個子APIResponse

ArrayList<APIResponse> list = new ArrayList<MyAPIResponse>();
list.add(new YourAPIResponse());

如果ArrayList<MyAPIReponse>對象可以放入ArrayList<APIResponse>變量中,則可以編譯此代碼-但結果是將YourAPIResponse對象插入List<MyAPIResponse> ,從而破壞了Java的類型安全性。 這就是為什么你不能這樣做。

顯然,這限制了純泛型的功能。 為了解決這個問題,發明了通配符泛型。 因此,您可以執行以下操作:

ArrayList<? extends APIResponse> list = new ArrayList<MyAPIResponse>();

但是,如果您要從上方添加第二行,它將無法編譯,因為編譯器無法驗證參數的運行時類型是否適合ArrayList的type參數。 因此,類型安全性得以保留。

暫無
暫無

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

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