標籤:java 程式 opened 取值 問題 編譯 傳回值 分享 解決
一個新技術的誕生,必定有其曆史原因,通過究其曆史,也能加深對技術的理解。
Java1.5之後增加了泛型的使用,那麼為什麼要增加泛型呢?本文主要講述這個問題。
首先考慮一下如下的情況,
1 package com.test.generic; 2 3 public class GenericTest { 4 private Boolean f; 5 6 public Boolean getF() { 7 return f; 8 } 9 10 public void setF(Boolean f) {11 this.f = f;12 }13 14 15 }View Code
1 package com.test.generic; 2 3 public class GenericTest1 { 4 private String s; 5 6 public String getS() { 7 return s; 8 } 9 10 public void setS(String s) {11 this.s = s;12 }13 14 }View Code
GenericTest和GenericTest1這兩個類的實現的功能相同,只是方法的傳回值和成員變數之間的差異,對於一些工具類來說,往往會對不同的資料類型進行處理,那麼此時,就需要增加大量的對不同類型的資料處理的類,對於一個工程來說,這是可怕並且無意義的工作。在泛型之前,也有一個比較好的處理方式,如類GenericTest2,我們可以採用Object(介面或者父類)的類型,來實現對不同類型資料的處理。但這也不夠完美,首先,每一次傳進去的資料和取出來的資料必須一致,即使不一致,編譯器也不會報錯或者IDE也不會提醒問題;其次,假定傳入的Object對象是String,但是我取值是強制轉換成Integer,這在編譯的時候也不會報錯,運行時就會出現ClassCastException,這樣問題就無法在編譯時間出現,對於程式來說,健壯性大大降低。所以,在Java1.5之後出現了泛型來解決這些問題。
1 package com.testeneric; 2 3 public class GenericTest2 { 4 private Object o; 5 6 public Object getO() { 7 return o; 8 } 9 10 public void setO(Object o) {11 this.o = o;12 }13 14 }View Code
如類GenericTest3
1 package com.test.generic; 2 3 public class GenericTest3<T> { 4 private T o; 5 6 public T getO() { 7 return o; 8 } 9 10 public void setO(T o) {11 this.o = o;12 }13 14 public static void main(String[] args) {15 GenericTest3<String> test1 = new GenericTest3<String>();16 17 test1.setO("hello");18 System.out.println(test1.getO());19 }20 }View Code
這樣類的參數類型是T,那麼什麼類型都可以傳入到類中,實現了對不同類型的資料進行處理,並且在使用的時候,如果使用的是IDE,那麼一旦確認下來T是什麼類型,編譯器就會提示該類型,只要編譯的時候沒有問題,那麼運行時也不會出現問題。
Java為什麼要在1.5之後增加泛型