關於java泛型的理解

泛型有泛型類,泛型方法,泛型邊界的問題

泛型類的使用:

LinkStack<String> lls = new LinkStack<>();可以根據傳入的類型確定泛型T的類型,比如傳入String類型,lls類就只能添加String類型的了,泛型使類更加靈活具備不同的功能。注意:泛型類在創建的時候必須制定類型,不過編譯的時候相關的泛型類型會被擦除,也就是運行的時候LinkStack<String> lls = new LinkStack<>();和LinkStack<Integer> lls = new LinkStack<>();是一樣的

泛型方法:能夠使用泛型方法的優先使用泛型方法,定義泛型方法,只需要將方形參數列表置於返回值之前就可以了,就像這樣

public <T> void f(T x ){System.out.println(x.getClass().getName())}//體現了泛型方法使用的時候可以不下確定具體類型

多泛型方法public <A,B,C> void f(A a,B b,C c){}

泛型邊界理解:邊界是可以控制你使用的參數類型的上線,更重要的是你可以按照自己的邊界去調用想要的方法。

因爲T類型繼承了HasColor,就可以使用該接口的方法

通配符:

雖然integer是Number的子類型,但是用Number的容器卻不能存入integer的類型。實際這兩個容器並不是同一類型的容器,是不同類型的List,這時候爲了顯示java的多態性,就需要使用通配符?如下圖二,?允許你編譯的時候傳入任何類型的參數

通配符邊界:如果我們想要控制通配符的上下界,可以使用<? extend A>或者<? super A>

<? extend A>可以理解爲,具有從A類型繼承的類型列表,報錯是因爲? extend Integer只擁有繼承Integet類型的

改爲? extend Number就不會報錯,以爲Integer也是Number的子類。

<? super A> 也叫超類型通配符,聲明通配符是有哪個特性的基類爲界定的,也就是A是通配符的子類,不能對泛型參數給出超類型邊界,比如<T super A>這是錯的,下圖報錯是因爲通配符所匹配的子類僅僅只是number而已,無法添加Integer類型的,可以改成public static void getData(Box<? super Integer> data) { System.out.println("data :" + data.getData()); }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章