集合框架扩展之泛型
泛型
泛型(Generic),是JDK1.5之后新增java语法糖(糖衣语法:对程序本身没有任何影响,但是为开发者提供了更加便利的操作),泛型表示为参数化类型,即将一个数据类型作为参数传递到类,接口,方法中,将原本在运行期间才能出现的问题,提前到编译期间,从而优化代码的可能性(最大限度的避免一些运行时异常的出现);java中的泛型分为三种泛型表示:
- 泛型类
- 泛型接口
- 泛型方法
泛型类
直接在类后面通过<>包裹不确定的数据类型,在类中可以对这些不确定的类型使用,创建对象时声明具体的类型,这样一来,调用类中成分时,数据类型都已确定
/**泛型类*/
public class DateManager<S,D,I> {
private S s;
private D d;
private I i;
public void add(S s){
System.out.println(s);
}
public static void main(String[] args) {
DateManager<String,Date,Integer> m = new DateManager<>();
m.s = "hello";
m.i = 10;
m.d = new Date();
m.add(m.s);
}
}
泛型接口
泛型接口即在接口定义时使用泛型声明,比如完成一个员工管理系统时,系统中会涉及到一些必要的实体类:员工类,部门类;而针对这些类也会具备一些基本的管理操作(增删查改),由于软件项目的特殊性,要求扩展,以及高内聚低耦合等原则,因此,使用泛型接口可以统一管理,比如:
BaseManager.java
public interface BaseManager<T> {
/**添加*/
public boolean add(T e);
/**删除*/
public boolean delete(T e);
/**修改*/
public boolean update(T e);
/**根据id查询*/
public T findById(T e);
/**查询所有*/
public List<T> findAll(T e);
}
通过阅读以上接口不难看出,该接口主要完成一些增删改查操作,由于被操作的数据类型不确定性,因此我们可以通过指定泛型,让接口的实现类或者子接口确定数据类型,比如:
EmpManager.java
public class EmpManager implements BaseManager<Emp>{
@Override
public boolean add(Emp e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean delete(Emp e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean update(Emp e) {
// TODO Auto-generated method stub
return false;
}
@Override
public Emp findById(Emp e) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Emp> findAll(Emp e) {
// TODO Auto-generated method stub
return null;
}
}
DeptManager.java
public class DeptManagerImpl implements BaseManager<Dept>{
@Override
public boolean add(Dept e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean delete(Dept e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean update(Dept e) {
// TODO Auto-generated method stub
return false;
}
@Override
public Dept findById(Dept e) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Dept> findAll(Dept e) {
// TODO Auto-generated method stub
return null;
}
}
通过上述代码可以看出,在实现类实现接口时可以确定操作的数类型
Test.java
public class Test {
public static void main(String[] args) {
BaseManager<Emp> bm = new EmpManager();
BaseManager<Dept> bm2 = new DeptManager();
}
}
测试类中虽然可以创建不同的管理实现类,但是都可以使用同一个接口声明(多态),此时数据类型的检查即在编译期间解决。
泛型方法
public class DBManager {
//泛型方法
public <T> T queryOne(Class<T> t){
return null;
}
//泛型方法
public <T> List<T> queryList(Class<T> t){
return null;
}
//泛型方法
public <E> void doSomeThing(E e){
}
public static void main(String[] args) {
DBManager db = new DBManager();
Emp emp = db.queryOne(Emp.class);
Dept dept = db.queryOne(Dept.class);
List<Emp> list_emp = db.queryList(Emp.class);
List<Dept> list_dept = db.queryList(Dept.class);
}
}
一句话总结泛型:
将可能在运行期间出现的异常提前到编译期间。