------- android培训、java培训、期待与您交流! ----------
泛型在编译后是会被除去的,即会去掉类型信息
泛型是给编译器看的,在运用反射后得到class文件后,得到某些方法可以增加其他类型的成员
Vector<String> v = newVector<Object>() //错误,不写object也行,写了就会错误
Vector<Object> v = newVector<String>()//错误,泛型不考虑继承关系
创建数组实例时。数组的元素不能使用参数化的类型,例如下面错误语句
Vector<Integer> vectorList[] = newVector<Integer>[10];
以下不会报错
Vector v1 = new Vector<String>();
Vector<Object> v = v1 ;
编译器是不考虑运行时,所以都不会报错
<?> ?泛型通配符
使用泛型通配符后不能使用与类型有关的特殊方法
Public static voidprintCollection(Collection<?> collection){
//可以使用和Collection本有方法
collection.size();
for(objectobj:collection){
system.out.prinln(obj);
}
}
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法。
自定义泛型:
Private static<T> T add(T x ,T y){
Returnx&y;
}
泛型的类型只能是引用类型,不能是实际类型。
通配符比泛型方法更有效。但是使用泛型可以使用某些使用通配符时不能使用的方法。
泛型可以通过返回类型确定,可以通过参数类型确定
private static <T> T autoConvert(T obj){
return (T) obj;
}//根据返回类型定制泛型转换
泛型类 的类
public class GenericDao <T>{
public void add(T x){
}
public T getById(int i){
return null;
}
}
类中的各种方法统一为T类型,T类型即是泛型
要通过反射方法得到泛型的实际类型比较麻烦,没法直接通过class类得到,需要通过使用该泛型类的方法来得到该类型的实际类型
1--首先的到使用该泛型的方法Method
2--再通过方法method 的getGenericParameterTypes
()
得到参数类型Type[]
3--接着对type[]使用实现其接口的子接口ParameterizedType中的方法getRawType
()
得到声明该类型时的父类型Type[]数组,使用
getActualTypeArguments
()
得到此类型实际类型参数Type[]数组。
如何通过反射得到集合的实际类型?
由于编译器在编译后, 所有的集合类型实际类型都会被抹茶,所以,只有通过使用过该集合元素的方法得到实际的类型:
Menthod 的方法 getGenericParameterTypes()
返回值为Type[]
package com.itheima.day1;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Date;
import java.util.List;
public class ReflectFX {
public static void main(String[] args) throws Exception {
//通过反射得到一个使用过集合的方法
Method refleMethod = ReflectFX.class.getMethod("applyVector", List.class);
//通过方法的getGenericParameter,Types按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。法
Type[] types = refleMethod.getGenericParameterTypes();
//ParameterizedType 表示参数化类型,不过明明是接口为什么能使用强制转换?
ParameterizedType pType = (ParameterizedType)types[0];
//getActualTypeArguments() 返回表示此类型实际类型参数的 Type 对象的数组。
System.out.println(pType.getActualTypeArguments()[0]);
}
public static <T> void applyVector(List<Date> v1){
}
}