黑馬程序員_java高級篇泛型篇Day13

   ----------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------                                 



                                                  黑馬程序員_java高級篇泛型Day13

 泛型這裏只是記錄一下自己不懂的地方,對於一些概念,基本知識就不在這重複了。



#同一份字節碼#

ArrayList<String> str=new ArrayList();
ArrayList<Integer> i=new ArrayList();
System.out.println(str.getClass()==i.getClass());


輸出:true

說明調用的是同一份字節碼,範型是提供給javac使用的,讓編譯器擋住源程序的非法輸入,編譯器編譯帶範型的集合時,會去掉範型。使程序效率不受影響。如果是那樣,是不是隻要透過編譯器,就可以實現將string類型的數據加入,int中。

這樣我們可以將string類型的數據加入,int中。

Method addm=str.getClass().getMethod("add",Object.class);
System.out.println(addm.invoke(i,"1"));
System.out.println(i.get(0));


但是如果我們

Method addm=str.getClass().getMethod("add",Object.class);
System.out.println(addm.invoke(str,1));
System.out.println(str.get(0));


將int類型的數據加入String中,會報錯。


#泛型中的?通配符#


public static void printCollection(Collection<?> coll) {
//當我們用了通配符後,我們不能調用他的方法,會報錯。
//coll.add("w");
//但是我們可以調用
coll.size();
for(Object obj:coll)
{
System.out.println(obj);
}
}
調用這個方法:
Collection<String> coll=new Vector<String>();
coll.add("sd");
coll.add("sda");
printCollection(coll);
}


#通配符的擴展#<T>

Java的泛型是從C++引入的。泛型模板


int a=add(2,3);
Number b=add(2.3,4);
Object c=add("sd",9);
public static <T>  T add(T x,T y)
{
return x;
}


對換數組的元素位置

public static <T> void swap(T[] a,int i,int j)
{
T temp=a[i];
a[i]=a[j];
a[j]=temp;
        	        	  
}
String[] str={"ouyang","zhd","lw"};
swap(str,1,2);
for(String s:str)
{
      	System.out.println(s);
}
int[] testint={1,2,3}; 


//這個是錯誤的,必須是引用類型,不能是基本類型。

swap(testint,1,2);//必須是引用類型,不能是基本類型。

將Object轉爲任意對象類型

public static <T>  T auto(Object obj)
{
return (T)obj;
}


打印出任意集合中的元素

public static <T> void printSet(Collection<T> t)
{
for(T a:t)
{
System.out.println(a);
}
}


在這種情況下,通配符的方案要比泛型方法更加有效,但是我們用?通配符時,我們不能適應集合的方法,但是後一種可以使用。

定義泛型類型

當我們在操作數據庫時,我們會注意到

public void add(Person p)
{
}


我們添加的是人,但是如果我們添加的是產品,不又要改嗎,所以我們乾脆定義爲

這樣,

public <T> void add(T p)
{
}


得到泛型類型:

Vector<Date> v=new Vector<Date>();
Method m=EntrySet.class.getMethod("applyVector",Vector.class);
    Type[] t=m.getGenericParameterTypes();
    ParameterizedType pt=(ParameterizedType)t[0];
   System.out.println(pt.getRawType());
   System.out.println(pt.getActualTypeArguments()[0]);
public static void applyVector(Vector<Date> v)
{
System.out.println(v.getClass().getTypeParameters());
}


如果這個類中有許多的方法,我就可以將<T>,放到

public class DaoSet <T> {
   //還要注意的是,當我們用add時,我們可以添加人,但是findid就不一樣了
   //這個T可能是另外一種東西,所以我們怎麼使得所有的函數都一樣呢?直接
   //將T放到DaoSet後面,這樣多個函數使用的是一個方法。
public  void add(T p)
{
}
public   T findId(int id)
{
return null;
}
}
但是當加入靜態方法時,我們應該注意,
//如果靜態方法也要使用泛型,那必須自己定義,如下:這個T與上面的不一樣
//它是獨樹一派。
public   static <T> T find(T t)
{
return null;
}


   ----------------------ASP.Net+Android+IOS開發.Net培訓、期待與您交流! --------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章