1.泛型的定义
泛型是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。方便将大量的类似的代码进行代码级别的优化。之所以要使用泛型,就是需要大量的使用容器类,原来的数组已经满足不了需求,
2.泛型使用场景
泛型在java中,随处可见,比如在使用HashMap时,需要对数据的key与value类型进行定义,如果不适用泛型,则会定义多个HashMap的类型,代码的核心内容和思想是完全的相同,可能只是其中的需要处理的数据的类型不同。如果使用了泛型,则可以避免类似的问题。比如HashMap的定义如下:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable{.....}
通过HashMap的定义,在实例化时,如果你想key与value的类型是String,或者Int都可以,然后进行数据的put操作或者get操作。
在web代码的开发环境中,大量的实体类型存在添加、修改、删除和查询操作的,如果为每一个实体都写相同的操作,代码的冗余量非常大,如果使用泛型,则会在完成相同的功能的前提下,少写大量的代码,例如:添加,修改,删除的操作类使用了泛型的定义如下:
public class CommonDaoImpl<T> implements ICommonDao<T>{
public CommonDaoImpl() {
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();// 获取泛型类型的参数类别
clazz = (Class<T>) type.getActualTypeArguments()[0];// 获取泛型参数的第一个参数
}
@Override
public Serializable save(T entity) {//数据的添加操作
Serializable id = this.getSession().save(entity);
return id;
}
}
以上的类和方法,完全是做了一些公共的操作方法,只需要在编写代码的过程中,将要操作的实体传过来,则会完成相应的操作,大大的减少了代码量,提高了工作效率。
3.泛型分类
泛型的的类别一般就是泛型类,泛型方法,泛型数组,但是,通常是不能直接定义泛型数组的,而是使用了java代码库中定义的如:List接口和其实现类来操作的。
1) 简单的泛型
泛型的定义非常的简单,在定义的类之后加上<T>,其中的T可以使任意的字符,如:public class BaseAction<T>{......}
2) 泛型接口
在java中,接口也可以使泛型的,将接口定义为泛型,实现类可以根据具体的实体去操作数据,如:java源代码中List对象的泛型定义如下:
public interface List<E> extends Collection<E>{
Iterator<E> iterator();
E set(int index, E element);
......
}
在泛型接口中定义以后,实现类可以根据自己的需要,然后传入实体对象,对数据进行操作。
3) 泛型方法
泛型方法使得该方法能偶独立于类而产生变化,如论何时,只要能够做到,就尽量的使用泛型方法,如果泛型方法可以取代将整个类泛型化,那就应该只是用泛型方法。要定义泛型方法,则需要将泛型参数列表至于返回值之前。如下面代码:
public class GenericMethod
{
public <T> String toString(T oT) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException
{
…………
}
}
只需要在方法中使用泛型,不需要在类中加入泛型的定义,同时也要将返回的泛型添加到返回值的前面。
4.泛型边界
边界使得你可以在泛型的参数上设置限制条件。比如你传入的参数必须是某一个类的子类,不继承自该类的就不能作为参数,则在泛型定义时就要进行限制,对于此种情况,定义如下:
public class Dog<? extends Animal>{.....}
此时,参数的对象必须继承对象Animal,才能够是正确的使用方式,保证类类型的安全
如果你的泛型的参数限制必须是某个类的父类或者某个类的下限,则可以使用如果的方式
public class SuperTypeWildcards<? super Apple>{
…………
}
泛型的边界可以保证你传入一个安全的对象到泛型类型中,从而确保传入的参数类型的安全。