----------------------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培训、期待与您交流! --------