Java泛型和類型安全的容器

示例:app

1 public class Apple {
2     private static long counter;
3     private final long id = counter++;
4     
5     public long id(){
6         return id;
7     }
8 }
1 public class Orange {
2 
3 }
 1 public class ApplesAndOrangesWithoutGenerics {
 2     @SuppressWarnings({ "rawtypes", "unchecked" })
 3     public static void main(String[] args) {
 4         //定義一個ArrayList容器, 不指定其類型
 5         ArrayList apples = new ArrayList();
 6         for (int i = 0; i < 3; i++) {
 7             apples.add(new Apple());
 8         }
 9         
10         apples.add(new Orange());
11         
12         //此時, apples容器中存在4個對象, 其中前三個爲Apple類型, 最後一個爲Orange類型
13         for (int i = 0; i < apples.size(); i++) {
14             //get()方法取值時, 獲得的只是Object的引用, 必須將其強制轉型爲Apple, 不然編譯錯誤
15             //當試圖將Orange對象轉型爲Apple時, 發生類型轉換異常
16             System.out.println(((Apple)apples.get(i)).id());
17             /*
18              * output:
19              * 0
20              * 1
21              * 2
22              * */
23         }
24     }
25 }

    在本例中,由於ArrayList保存的是Object,因此能夠將Apple對象和Orange對象放進容器中,當在使用ArrayList的get()方法來取出Apple對象時,獲得的只是Object的引用,必須將其轉型爲Apple,所以,需在調用Apple的id()方法以前,強制進行轉型,不然,spa

就會獲得編譯錯誤。code

 

    剛纔聲明容器時沒有預先定義類型,默認爲Object,如今使用預約義泛型來看看:對象

 1 public class ApplesAndOrangesWithoutGenerics2 {
 2     public static void main(String[] args) {
 3         //定義一個保存Apple對象的ArrayList, 尖括號括起來的是類型參數
 4         //它指定了這個容器示例能夠保存的類型, 經過使用泛型, 就能夠在編譯器放置將錯誤類型的對象放置到容器中
 5         ArrayList<Apple> apples = new ArrayList<Apple>();
 6         for (int i = 0; i < 3; i++) {
 7             apples.add(new Apple());
 8         }
 9         
10         //apples.add(new Orange());  編譯器能夠阻止將Orange放置到apples中
11         
12         for (int i = 0; i < apples.size(); i++) {
13             System.out.println(apples.get(i).id());
14         }
15         
16         for (Apple c : apples) {
17             System.out.println(c.id());
18         }
19         
20         /*output
21          * 0
22          * 1
23          * 2
24          * 0
25          * 1
26          * 2
27          * */
28     }
29 }

    咱們注意到,定義了容器類型後,編譯器能夠阻止將Orange放置到apples中,由於此時Orange對象的類型與容器類型不匹配,發生編譯錯誤;另外,將元素從容器中取出時,類型轉換也再也不時必須的了,由於容器知道本身保存的是什麼類型,所以會在調用blog

get()時幫忙轉型。get

相關文章
相關標籤/搜索