以平实之心写作
writing with simple heart ♬.
java泛型小结
KinglyJn
2012-11-16
泛型类
public class Fanxinglei<T> {
private T obj;
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
@Override
public String toString() {
return "Fanxinglei [obj=" + obj + "]";
}
public static void main(String[] args) {
Fanxinglei<String> fxl = new Fanxinglei<String>();
fxl.setObj("哈哈哈");
System.out.println(fxl);
}
}
//运行结果
Fanxinglei [obj=哈哈哈]
泛型方法
public <T extends Number> double add(T t1, T t2) {
double sum = 0.0;
sum = t1.doubleValue() + t2.doubleValue();
return sum;
}
public static <T> T getObj(Class<T> c) throws Exception {
return c.newInstance();
}
泛型接口
public class Fanxing {
public static void main(String[] args) {
InterImpl<String> interImpl = new InterImpl<String>();
interImpl.show("哈哈哈");
}
}
interface Inter<T> { //interface
void show(T t);
}
class InterImpl<T> implements Inter<T> { //interafceImpl
@Override
public void show(T t) {
System.out.println(t);
}
}
四种泛型类型及其测试
package test;
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 泛型:编译的过程中进行检查,编译完成后生成的class文件已将泛型擦除
* 获取泛型:getGenericSuperClass、getGenericType
* 泛型类型:
* ParameterizedType:
* 含有泛型的列表的Type,如 BaseDao<Student>、Map<K,V>、List<? extends Person>
* TypeVariable:
* 本身就是泛型的Type,如 E、T、K、V
* GenericArrayType:
* 数组中含有泛型的Type,如 Map<String,Integer>[]、List<? extends Person>[]
* WildcardType:
* 含有通配符的Type,如 List<? extends Person>、List<? super Student>
*/
public class StudentDao<E extends Person> extends BaseDao<Student> {
private Map<String, E> map;
private List<? extends Person> list;
private E[] vtypeArray;
private Map<String,Integer>[] mapArray;
public void wildcardParamsMethod(
List<? extends Person> list1,
List<? super Student> list2,
Class<?> clazz1,
Class<Student> claszz2) {
// TODO
}
/**
* main
*
*/
public static void main(String[] args) throws Exception {
StudentDao<Person> studentDao = new StudentDao<Person>();
/**
* 测试含有泛型的父类
*/
Type genericSuperclass = studentDao.getClass().getGenericSuperclass();
//判断StudentDao的父类有没有泛型化(即BaseDao后面有没有<..>)
if (genericSuperclass instanceof ParameterizedType) {
/*
* 返回这个Type泛型列表对应的实际类型数组
* 如 Map<String,Person> 这个ParameterizedType返回的是
* String和Person类的全限定类名的 Type Array
*/
Type[] actualTypeArguments =
((ParameterizedType) genericSuperclass).getActualTypeArguments();
System.out.println(actualTypeArguments[0]); //class test.Student
/*
* 返回的是当前这个ParameterizedType的Type。
* 如 Map<String,Person>这个ParameterizedType返回的是
* Map类的全限定类名的 Type Array
*/
Type rawType = ((ParameterizedType) genericSuperclass).getRawType();
System.out.println(rawType); //class test.BaseDao
}
/**
* 测试含有泛型的属性
*/
System.out.println();
Field[] fields = studentDao.getClass().getDeclaredFields(); //获取自身私有或公开的属性
for (Field field : fields) {
Type genericType = field.getGenericType();
/*
* 判断属性本身属于哪一类
*/
//含有泛型列表的元素,如Map<K,V>、List<? extends T>
if (genericType instanceof ParameterizedType) {
Type[] actualTypeArguments =
((ParameterizedType) genericType).getActualTypeArguments();
for (Type type : actualTypeArguments) {
/*
* 判断属性的泛型列表元素属于哪一类
*/
if (type instanceof TypeVariable) { //Map<K,V>、List<T>
Type[] bounds = ((TypeVariable<?>) type).getBounds();
StringBuffer sb = new StringBuffer();
for (Type boundType : bounds) {
sb.append(boundType.getTypeName() + ",");
}
System.out.println(field.getName()
+ ":ParameterizedType-泛型列表-泛型类 "
+ type.getTypeName() + ",泛型类的上边界为 "
+ sb.substring(0, sb.lastIndexOf(",")) );
} else { //Map<String,Integer>、List<? extends Person>
System.out.println(field.getName()
+ ":ParameterizedType-泛型列表-普通类 "
+ type.getTypeName());
}
}
} else if (genericType instanceof GenericArrayType) {
//数组的元含有泛型,如T[]、List<String>[]
Type genericComponentType =
((GenericArrayType) genericType).getGenericComponentType();
/*
* 判断数组元素属于哪一类
*/
if (genericComponentType instanceof ParameterizedType) {
//Map<String,Integer>[]、List<String>[]
Type rawType =
((ParameterizedType) genericComponentType).getRawType();
Type[] actualTypeArguments =
((ParameterizedType) genericComponentType).getActualTypeArguments();
System.out.println(field.getName()
+ ":GenericArrayType-数组元素及其泛型列表为 "
+ rawType.getTypeName()
+ Arrays.toString(actualTypeArguments));
} else if (genericComponentType instanceof TypeVariable) { //E[]
String typeName = ((TypeVariable<?>) genericComponentType).getName();
System.out.println(field.getName()
+ ":TypeVariable-数组元素及其泛型名称为 "
+ typeName);
} else {
System.out.println(field.getName() + ":待论");
}
}
System.out.println("------------------------------");
}
/**
* 测试含有泛型的方法
*/
System.out.println();
Method wildcardParamsMethod = studentDao.getClass()
.getDeclaredMethod("wildcardParamsMethod",
new Class[]{List.class, List.class, Class.class, Class.class});
Type[] genericParameterTypes =
wildcardParamsMethod.getGenericParameterTypes(); //参数列表个元素的type
for (Type type : genericParameterTypes) {
/*
* 判断Type是否含有泛型列表,如果没有则继续遍历
*/
if (!(type instanceof ParameterizedType)) {
continue;
}
/*
* 判断Type泛型列表中是否含有通配符
*/
Type[] actualTypeArguments =
((ParameterizedType)type).getActualTypeArguments();
for (Type actualType : actualTypeArguments) {
if (!(actualType instanceof WildcardType)) {
continue;
}
WildcardType wildcardType = (WildcardType) actualType;
Type[] lowerBounds = wildcardType.getLowerBounds();
Type[] upperBounds = wildcardType.getUpperBounds();
System.out.println(type.getTypeName()
+ ":下边界为 " + Arrays.toString(lowerBounds)
+ ",上边界为 " + Arrays.toString(upperBounds));
}
}
}
}
/*
测试结果:
==========================================================
class test.Student
class test.BaseDao
map:ParameterizedType-泛型列表-普通类 java.lang.String
map:ParameterizedType-泛型列表-泛型类 E,泛型类的上边界为 test.Person
------------------------------
list:ParameterizedType-泛型列表-普通类 ? extends test.Person
------------------------------
vtypeArray:TypeVariable-数组元素及其泛型名称为 E
------------------------------
mapArray:GenericArrayType-数组元素及其泛型列表为 java.util.Map[class java.lang.String, class java.lang.Integer]
------------------------------
java.util.List<? extends test.Person>:下边界为 [],上边界为 [class test.Person]
java.util.List<? super test.Student>:下边界为 [class test.Student],上边界为 [class java.lang.Object]
java.lang.Class<?>:下边界为 [],上边界为 [class java.lang.Object]
==========================================================
*/