[英]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
實例(或子類),就像您在某些注釋中所暗示的那樣。
它表示第二個參數可以是APIResponse的任何子類。
如果該方法的參數類型為Class<APIResponse>
,則將指示其類型參數為APIResponse
的Class
對象-而不是其任何子類。 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.