泛型的通配符問題

泛型是把類型做爲一種參數來指定,使用泛型以後類型就不是一成不變的了 ,而是經過參數來進行設定。泛型能夠是系統JAVA中的 類 ,也能夠是本身建立的類, 另外還有泛型通配符,無限定的通配符? 或者是 上限通配符 ?extends T , 或者是 下限通配符 ?super T 。 上限表明最高繼承與T 類型 ,下限表明最低是T類型 或是T的 父類 。如下 介紹幾種泛型的使用例子。 `java

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

//泛型的通配符問題
public class Ex_21 {

	// 演示1:泛型參數不會主動考慮繼承關係

	public void test() {
		List<B> listB = new ArrayList<B>();
		List<C> listC = new ArrayList<C>();
		List<A> listA = new ArrayList<A>();
		// 遍歷輸出B
        print_1(listB);
        print_1(listA);
        print_1(listC);
//        print_2(listB);
//        print_2(listA);
//        print_2(listC);
	}
//輸出
	public void print_1(Collection<?> c) {
		for (Object obj : c) {
			System.out.println(obj);
		}
	}
//輸出方法
	public  void print_2(Collection<Object> c){
		for(Object obj: c){
			System.out.println(obj);
		}
	}
	/*
	 * 總結 :明顯 第二種會報錯, Object 其父類 可是 泛型 不會主動考慮繼承關係
	 *  
	 */
	//演示2: 通配符 上界
	public void test2(){
		List<? extends A> listA = new ArrayList<A>();
//		listA.add(new A());
		//假如想加入 A的類型 和A的子類怎麼辦?
//以下處理就能夠 
		List<A> list = new ArrayList<A>();
		list.add(new A());
		list.add(new B());
		list.add(new C());
		//沒法使用 帶有泛型通配符的引用調用 泛型的方法 
 	}
	//演示3: 自定義泛型方法
這個比較經常使用  泛型方法 能夠接受 不一樣類型參數 實現相同功能 ;
	public static <T>T getLast(T[] a){
		return a[a.length-1] ;
	}
	public void test3(){
		String [] str = {"100","200","300"};
		Integer [] in = {400,500,600};
		Ex_21.<String> getLast(str);
		Ex_21.<Integer> getLast(in);
	}
	//演示4: 實現指定類型 ,容器類型
	public void test4(){
		M_value <Integer> m = new M_value<Integer>();
		m.setValue(100);
		Integer i  = m.getValue();
		System.out.println(i);
		
	}
	//該類封裝了數據, 數據 繼承了Number 而且實現了Serialziable 和 Comparable 接口
	class M_value <M extends Number & Serializable & Comparable>{
		private M value;
		public M getValue(){
			return value; 
		}
		public void setValue(M value){
			this.value = value; 
		}
	}`
相關文章
相關標籤/搜索