實例化:
List<String> list = new ArrayList<String>();
Map<Object, Object> map = new HashMap<Object, Object>();
泛型讓變編譯器做類型安全檢查,運行時候類型就被確定,此時泛型會被去除泛型只可以寫基本數據類型
接下來可以看看自定義泛型:自定義泛型可以用一個E來表示泛型的元素,在實例化時候,泛型前後必須一致
聲明泛型Test<Long>和Test<Integer>是兩個是不一樣的類型,所以需要一致,Test<Long> f = new Test<Integer>();這樣是不行的,但是可以這樣Test<Long> f = new Test<>();不過需要jdk1.7之後可以這樣用
public class Test<E> {
public void add(E e){
}
public static void main(String[] args) {
Test<String> f = new Test<String>();
//實例化的時候泛型前後需要一致,
//例如Test<Long> f = new Test<Integer>();這樣是不行的
//但是可以這樣Test<Long> f = new Test<>();不過需要jdk1.7之後可以這樣用
//Test<Long>和Test<Integer>是兩個是不一樣的類型
f.add("ee");
}
}
泛型的繼承:下面的類的泛型類型只能是Number或者Number的子類型,所以Long,Integer,Double都可以作爲泛型的類型,但是String,char等等就不可以了
//此時泛型只能是Number子類類型
public class Point<T extends Number>{
public static void main(String[] args) {
Point<Long> p = new Point<Long>();
Point<Integer> p1 = new Point<Integer>();
Point<Double> p2 = new Point<Double>();
//Point<String> p2 = new Point<String>();
//String不是Number的子類所以錯誤
}
}
泛型的通配符:T表示泛型,定義泛型變量private T x; 此時泛型類可以使任意一種簡單數據類型,
下列代碼有用到通配符Point<?> 代表可以傳入任意數據類型,Point<? extends Number>代表只要是Number或者Number的子類就可以,而Point<? super Double> 代碼必須是Double或者Double的父類(比如Number)纔可以,需要注意的是extends可以在寫自定義類的泛型上,而super是不可以。
public class Point<T>{
//參數的定義
private T x;
private T y;
public static void main(String[] args) {
Point<Long> p = new Point<Long>();
Point<Integer> p1 = new Point<Integer>();
Point<Double> p2 = new Point<Double>();
}
//通配符
//可以處理所有Point泛型的類型
public void draw(Point<?> p){
}
//只能傳Number或者Number子類
//extends可以寫到自定義類上面
public void draw1(Point<? extends Number> p){
}
//只能傳Double或者Double父類
//super不能寫到自定義類上面
public void draw3(Point<? super Double> p){
}
}
方法的泛型:多用於接口的使用,不是用的對數據進行操作,這個方法可以傳入任意數據,進行返回,通常可以接口實現
public <T> T Test1(T t){
return t;
}
接口實現:定義接口,寫泛型方法,此方法的功能是傳入一個任意類型Class,返回一個實例化對象
這裏使用到了反射傳入任意數據類型的如s.getClass(); 通過newInstance()方法創建一個對象返回
public interface Test2 {
public <T> T getObject(Class<T> ass);
}
public class Test2Impl implements Test2{
public <T> T getObject(Class<T> ass){
// TODO Auto-generated method stub
try {
return ass.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static void main(String args[]){
Test2Impl t = new Test2Impl();
String s = t.getObject(s.getClass());
}
}