黑马程序员_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培训、期待与您交流! --------

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