示例: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