java泛型

常見需要泛型的有List,Map,Set

實例化:


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());
	}
}






發佈了29 篇原創文章 · 獲贊 9 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章