一:泛型指省去类型转换之苦。泛型集合:只能存储同一类型的对象
Java的泛型只在编译前对集合类型进行规范,编译后将去“类型化”不再保留泛型的信息。
二:泛型规则
1.参数化类型不等,不考虑类型参数的继承关系
Vector<String> v=new Vector<Object>(); //错误
Vector<Object> v=new Vector<String>(); //错误
2.在创建数组实例时,数组的元素不能使用参数化的类型
Vector<Integer> vectorList[]=new Vector<Integer>[10]; //语法错误
3.参数类型化与原始类型的兼容性
Collection<String> c=new Vector();
Collection c=new Vector<String>();
三:泛型中的“?”通配符
"?"代表任意类型,使用?通配符可以引用其他参数化的类型,?通配符定义的变量主要用作引用调用与参数化无关的方法,不能调用与参数化有关的方法(比如add()方法)
四:限定通配符的边界
1.限定通配符的上边界:
Vector<? extends Number> x=new Vector<Integer>(); //Integer必须是Number的子类
Vector<? extends Number> x=new Vector<Integer>(); //错误
2.限定通配符的下边界:
Vector<? super Integer> x=new Vector<Number>();
Vector<? super Integer> x=new Vector<Number>(); //错误
五:代码测试
1.// 对map的泛型进行迭代
HashMap<String, Integer> maps = new HashMap<String, Integer>();
maps.put("wzl", 20);
maps.put("hlw", 21);
// 将map型转换成Set
Set<Map.Entry<String, Integer>> entrySet = maps.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
2.// 泛型中的"?"通配符的使用(不能调用与参数化有关的方法(比如add()方法))
public static void printCollection(List<?> list) {
System.out.println(list.size());
for (Object object : list) {
System.out.println(object);
}
}
3.使用类似于C++的模版解决'?"通配符不能调用参数化的方法
public static <T> void printCollection2(List<T> list, T obj) {
System.out.println(list.size());
for (Object object : list) {
System.out.println(object);
}
list.add(obj);
}
4. // 使用泛型对任意类型的数组元素进行交换
public static <T> void swap(T[] a, int j, int k) {
T temp = a[j];
a[j] = a[k];
a[k] = temp;
}
5.//自定义泛型类,目的:类中的多个方法使用的是同一类型
/*
* 自定义泛型类
*/
//数据的crud
public class Geneticdao<T> {
public void add() {
}
public T findById(int id) {
return null;
}
// 查询条件
public Set<T> findByConditions(String where) {
return null;
}
public void Update(T obj) {
}
}
6.//创建泛型类对象,指定泛型类对象类型
Geneticdao<String> dao=new Geneticdao<String>();
PS:静态方法不能用泛型的类,因为静态方法无需创建对象就能调用,无法确定静态方法所属对象的类型!!!
7.//通过反射来获得泛型的实际参数类型
//通过将类型转换成一个方法的参数,通过反射获取该方法的参数类型
Method applyMethod = GenericTest.class.getMethod("apply", Vector.class);
// 得到参数类型组
java.lang.reflect.Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType type = (ParameterizedType) types[0];
System.out.println(type.getActualTypeArguments()[0]); // java.util.Date//得到泛型的实际类型参数
}
// 通过反射获取泛型的实际参数类型
public static void apply(Vector<Date> v) {
}