先簡單來段例子:
<code>public void testGenerics() {<br> Collection<Number> numbers = new ArrayList<>();<br> numbers.add(1); // ok<br> numbers.add(0.1); // ok<br><br> Collection<? extends Number> numbers2 = new ArrayList<>();<br> // don't work, you don't know which subtype 'numbers2' exactly contains<br> numbers2.add(1); // oops!<br>}<br></code>
這個例子其實有點反人類,估計大部分人(包括我)對這種轉換的第一反應肯定是「當然是對的」(這就掉坑了),說下我的理解:
Collection
Collection extends Number>:表示這個Collection是Number類型的「某個子類型」的Collection實例,可以是Collection< Integer>/Collection
Collection
再來個例子:
<code>public void testGenerics() {<br> Collection<Number> numbers = new ArrayList<>();<br> Collection<Integer> integers = new ArrayList<>();<br> Collection<? extends Number> numbers2 = new ArrayList<>();<br> <br> numbers2 = integers; // ok<br> numbers2 = numbers; // ok<br> <br> // don't work, Collection<Number> != Collection<Integer><br> numbers = integers; // oops!<br>}<br></code>
Integer明明繼承了Number,那為什麼
Collection
#不成立呢,我們再來看個例子:
<code>public void testGenerics() {<br> Collection<Integer> profits = new ArrayList<>();<br> <br> insertSomething(profits); // line 1<br> <br> Integer profit = profits.iterator().next(); // oops! crash<br>}<br><br>private void insertSomething(Collection<Number> numbers) {<br> numbers.add(Long.MAX_VALUE);<br>}<br></code>
如果line 1成立,那麼接下去獲取利潤將會得到個負數,後續的一系列計算都會發聲異常,如果代碼不夠健壯甚至可能會拋出一些意料之外的RuntimeException,導致方法不正常結束甚至程式crash。
所以一句話,Collection
現在再來說Collection
<code>public void testGenerics2() {<br> Collection<Integer> integers = new ArrayList<>();<br><br> Collection<?> objects2 = integers; // ok<br> // don't work, which type of 'objects2' contains is uncertain<br> objects2.add(1); // oops!<br> <br> Collection<Object> objects = integers; // oops!<br>}<br></code>
#Collection>表示的範圍比Collection
無法呼叫objects2.add(1)是因為編譯器無法精確推斷objects2到底是哪一種資料型別的容器,可能會產生執行時期的型別轉換異常;
#表示任意資料型別集合的正確寫法是Collection>;
Collection
為什麼Collection
<code>public void testGenerics() {<br> Collection<Integer> integers = new ArrayList<>();<br><br> Collection<Object> objects = integers; // oops!<br> // don't work, which type of 'objects2' contains is uncertain<br> objects.add("1");<br><br> Integer one = objects.iterator().next(); // oops! crash<br>}<br></code>
#Collection
Collection< ;?>無法在容器中放數據,因為? (UnknownType)是未知類型,無法判斷obj instanceof UnknownType的結果;
?是表示未知類型,Object表示的是已知類型;
如果Collection
以上是java泛型容器Collection怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!