黑马程序员技术交流社区
标题: java基础--泛型 [打印本页]
作者: 周发建 时间: 2016-3-25 14:45
标题: java基础--泛型
一、泛型(一)概述泛型是JDK1.5出现的用于编译器的技术,避免了强制类型转换的麻烦。
Jdk1.5出现的安全机制,将运行时期的问题转到了编译时期,避免了强制转换的麻烦。
擦除:泛型是在编译器中运行的,在运行期是没有泛型的,所以需要擦除。
补偿:在运行时,通过获取元素类型进行转换动作。使用者就不用做强制转换了。
泛型原理
泛型是提供给javac使用的,编译器可以挡住源程序中非法输入,从而可以限定向集合中存入的类型。
但是可以通过跳过编译器,用反射向集合中存入任意其他类型。
泛型类:将泛型定义在类上,类中所有的成员都可以使用
泛型方法:将泛型定义在方法上,只有这个方法可以使用所定义的泛型。【静态方法的要使用泛型,只能定义在泛型上】
泛型术语
ArryList<E> //泛型类型
E //类型变量或类型参数
ArryList<Integer>//参数化类型
Integer //类型参数的实例或实际类型参数
<> //typeof
ArrayList //原始类型
泛型在集合中的应用:泛型限定向集合存入对象的类型
TreeSet<Person> ps = new TreeSet<Person>();
(二)自定义泛型Class Generic<T>{
public <E extends A & B> void show(E e){}
public <F,J> void show2(F f, J j){}
}
泛型类
当类中操作的引用数据类型不确定的时候,就使用泛型了表示
泛型方法
当方法中的引用参数不确定时,定义泛型方法来表示
注意:静态方法,如果有泛型,就只能把泛型定义在方法上
泛型接口
(三)类型推断1. 当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被使用了,那么就根据调用方法时该处传递的实参确定。
2. 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被使用了,如果调用方法时多处的实参类型相同,那么就以这个实参确定。
3. 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被使用了,如果调用方法时多处的实参类型不同,并使用返回值,优先考虑返回值类型。
4. 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被使用了,如果调用方法时多处的实参类型不同,没有使用返回值,这使取决于多个实参类型的最大交集类。
5. 参数类型的类型推断具有传递性
(四)泛型限定泛型就是限定容器使用的类型。(仅限于编译前,反射可以绕过限定)
通配符 ?
上限:<? extends E> 只能是E或其子类 ,上限用于添加
下限:<? super E> 只能是E或其父类 ,下限用于获取
(五)获取类上定义的泛型类型public class BaseDao<T>{
private Class<T> clazz;
// 获取类上定义的泛型类型【只能获取直接父类的泛型类型】
public BaseDao(){
//获取直接父类的类型
Type type = this.getClass().getGenericSuperclass();
//转换成参数化类型
ParameterizedType ptype = (ParameterizedType) type;
//获取参数化类型的第1个实际参数
clazz = (Class<T>) ptype.getActualTypeArguments()[0];
}
public void add(T t){}
public void delete(String id){}
public void update(T t){}
public T find(String id){return null;}
public List<T> getfindAll(){return null;}
}
(六)获取方法上定义的泛型//2. 获取方法上的泛型类型
public void getMethodParameterizedType()throws Exception{
//获取指定方法
Method method = Demo.class.getMethod("method", int.class,Collection.class);
//获取方法中指定参数的类型
Type type = method.getGenericParameterTypes()[1];
//转换成参数化类型
ParameterizedType ptype = (ParameterizedType) type;
//获取参数化类型的第1个实际参数
Class clazz1 = (Class) ptype.getActualTypeArguments()[0];
System.out.println(clazz1.getName());
}
public void method(int a,Collection<Date> coll){}
作者: 715596417 时间: 2016-3-25 17:27
赞赞赞,还是很全的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |