首先,让我们来看看泛型类如何使用,使用泛型类有什么好处?
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
public class google {
public static void main(String[] args) throws Exception{
// 泛型是给编译器看的,可以用反射透过泛型赋其他类型的值
HashMap<String, Integer> maps = new HashMap<String, Integer>();
maps.put("sad", 123);
maps.put("saasdd", 12323);
//通过反射对maps非法加入其它类型字符
maps.getClass().getMethod("put", Object.class,Object.class).invoke(maps, "反射就是强大","成功了吧!");
//遍历maps集合的值
//利用自定义泛型类添加原属
Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
for(Map.Entry<String,Integer> m : entrySet){
System.out.println(m.getKey() + ":" + m.getValue());
}
//调用通用泛型
printHashMap(maps);
//ClassLoader.class.getClassLoader().getClass();
//自定义类加载器
//类加载时,会先交给上一级,从上级开始往下进行加载
Vector<Date> v = new Vector<Date>();
/**
* 我们则呢么得到泛型参数的类型呢,在这里我们可以吧泛型放到一个方法中
* Java为我们提供的得到方法中的泛型的参数类型
*/
Method applyMethod = google.class.getMethod("applyType", Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());
System.out.println(pType.getActualTypeArguments()[0]);
}
//(?)问号表示任意参数类型,是通配符
//? extends Number向上限定符,不能超出Number包涵的类型
//? super ?先下限定符
public static void applyType(Vector<Date> value){
}
public static void printHashMap(HashMap<? ,? extends Number> maps){
//在这里不能进行添加元素操作
System.out.println(maps.size());
}
public static <T> void printHashMaps(HashMap<T ,T> maps,T key,T value){
maps.put(key, value);
System.out.println(maps.size());
}
//模板方法设计模式父类定义流程细节了类实现(此方法仅在C/C++中可应用,有余Java虚拟机的关系,这里无法实现)
//这模板非常有用
public static <T> T add(T x,T y){
return null;
}
}
下面我们自定义一个简单的泛型类
//自定义泛型类泛型 类
public class tobe<T> {
public void add(){
}
public T find(int i){
return null;
}
//静态方法在泛型类,中不受约束
public static <E> E add(E x){
return null;
}
//通过反射拿到泛型里面参数的实际类型
public void del(T i){
}
}