1.1.1.如何理解泛型?
1.参化类型,数是JDK1.5的新特性。(定义泛型时使用参数可以简单理解为形参),例如List,Map<K,V>
2.编译时的一种类型,此类型仅仅在编译阶段有效,运行时无效.例如List在运行时String会被擦除,最终系统会认为都是Object.
1.1.2.为何使用泛型
泛型是进行类型设计或方法定义时的一种约束规范,基于此规范可以:
1.提高编程时灵活性(有点抽象,后续结合实例理解)。
2.提高程序运行时的性能。(在编译阶段解决一些运行时需要关注的问题,例如强转)
说明:泛型应用相对比较简单,难点在泛型类或方法的设计上,通过这样的设计如何对现有类进行”减法设计”,提高类或方法的通用性.
1.1.3.泛型的应用类型?
泛型定义时常用方式有三种(可参考List,Map<K,V)等接口定义):
1.泛型类: class 类名<泛型,…>{}
类泛型定义:(用于约束类中方法参数和方法返回值类型)
class Container<T>{//类泛型:类名<泛型>
public void add(T t){}//通过类泛型约束方法参数类型
public T get(){//通过类泛型约束方法返回值类型
return null;
}
}
说明:泛型应用时相当于实参传给形参,但是实参必须为对象类型。
2.泛型接口: interface 接口名<泛型,…>{}
定义接口时指定泛型,用于约束接口方法参数类型以及方法返回值类型,这里无须关心此类要做什么,重点先了解
语法.
interface Task<Param,Result>{//思考map中的泛型Map<K,V>
/**
* 此方法用于执行任务
* @param arg 其类型由泛型参数Param决定
* @return 其类型由泛型参数result决定
*/
Result execute(Param arg1);
}
3.泛型方法: 访问修饰符 <泛型> 方法返回值类型 方法名(形参){}
方法泛型应用:
1)Mybatis
class DefaultSqlSession{
/**泛型方法*/
public <T>T getMapper(Class<T> cls){
return null;
}
}
2)Spring
class ClassPathXmlApplicationContext{
//泛型方法:写一个getBean方法(仿照spring官方)
public <T>T getBean(Class<T> cls){
return null;
}
public <T>T getBean(String id,Class<T> cls){
return null;
}
}
总结:
1)泛型类和泛型接口用于约束类或接口中实例方法参数类型,返回值类型.
2)泛型类或泛型接口中实际泛型类型可以在定义子类或构建其对象时传入.
3)泛型方法用于约束本方法(实例方法或静态方法)的参数类型或返回值类型.
4)泛型类上的泛型不能约束类中静态方法的泛型类型.