JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。
但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
泛形的基本术语,以ArrayList<E>为例:<>念着typeof
•ArrayList<E>中的E称为类型参数变量
•ArrayList<Integer>中的Integer称为实际类型参数
•整个称为ArrayList<E>泛型类型
•整个BaseDao<Type>ParameterizedType/Type参数化的类型
泛型类
如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如下:
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getId(int id){}
}
注意,静态方法不能使用类定义的泛形,而应单独定义泛形。
--domain
1、BaseBean
1 //基础Bean 2 public class BaseBean { 3 public int id; 4 public String title; 5 public BaseBean(){} 6 public int getId() { 7 return id; 8 } 9 public void setId(int id) { 10 this.id = id; 11 } 12 public String getTitle() { 13 return title; 14 } 15 public void setTitle(String title) { 16 this.title = title; 17 } 18 }
2、版块
1 //版块 2 public class Type extends BaseBean{ 3 4 }
3、主题
1 //主题 2 public class Topic extends BaseBean{ 3 private String name; 4 public Topic(){} 5 public String getName() { 6 return name; 7 } 8 public void setName(String name) { 9 this.name = name; 10 } 11 }
--dao
1、BaseDao
1 import java.lang.reflect.ParameterizedType; 2 import java.lang.reflect.Type; 3 import java.sql.SQLException; 4 import org.apache.commons.dbutils.QueryRunner; 5 import org.apache.commons.dbutils.handlers.BeanHandler; 6 import cn.itcast.java.util.JdbcUtil; 7 8 public class BaseDao<T> { 9 private Class clazz; 10 private String tableName; 11 public BaseDao(){ 12 //取得BaseDao的字节码对象 13 Class baseDaoClass = this.getClass(); 14 //取得BaseDao的泛型类型 15 Type type = (Type) baseDaoClass.getGenericSuperclass(); 16 //将Type转发ParameterizedType,即取得BaseDao<Type>的参数化类型 17 ParameterizedType pt = (ParameterizedType) type; 18 //取得参数化类型中的实例参数类型,即Type,返回的是一个数组,取第一个 Map<String,Integer> 对应[0] [1] 19 this.clazz = (Class) pt.getActualTypeArguments()[0]; 20 int index = this.clazz.getName().lastIndexOf("."); 21 //表名 22 this.tableName = this.clazz.getName().substring(index+1).toLowerCase(); 23 } 24 public T findTById(int id) throws SQLException { 25 T t = null; 26 QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource()); 27 String sql = "select * from " + tableName + " where id = ?"; 28 t = (T) runner.query(sql, id, new BeanHandler(clazz)); 29 return t; 30 } 31 }
2、TypeDao
1 import cn.itcast.java.domain.Type; 2 3 public class TypeDao extends BaseDao<Type>{ 4 }
3、TopicDao
1 import cn.itcast.java.domain.Topic; 2 3 public class TopicDao extends BaseDao<Topic>{ 4 }
--test
1 import cn.itcast.java.dao.dao3.ReplyDao; 2 import cn.itcast.java.dao.dao3.TopicDao; 3 import cn.itcast.java.dao.dao3.TypeDao; 4 import cn.itcast.java.domain.Reply; 5 import cn.itcast.java.domain.Topic; 6 import cn.itcast.java.domain.Type; 7 8 public class TestDao3 { 9 public static void main(String[] args) throws Exception { 10 TypeDao typeDao = new TypeDao(); 11 Type type = typeDao.findTById(3); 12 System.out.println(type.getId()+":"+type.getTitle()); 13 System.out.println("==============================="); 14 TopicDao topicDao = new TopicDao(); 15 Topic topic = topicDao.findTById(3); 16 System.out.println(topic.getId()+":"+topic.getTitle() + ":" + topic.getName()); 17 System.out.println("==============================="); 18 ReplyDao replyDao = new ReplyDao(); 19 Reply reply = replyDao.findTById(3); 20 System.out.println(reply.getId() + ":" + reply.getTitle()); 21 } 22 }