这一章节我们来讨论一下什么时候使用泛型?

答案:当你希望代码能够跨多个类型(不同的类型,不包括继承关系)工作的时候。

1.当没有确切类型的时候

以下是错误的代码:

package com.ray.ch13;

public class Test<T> {

	private T obj;

	public Test(T t) {
obj = t;
} public void test() {
// obj.f();//error
}
}

从上面的代码能够看出,在没有确切类型的时候,obj是不能调用不论什么方法。

正确的代码:

package com.ray.ch13;

public class Test<T extends Person> {

	private T obj;

	public Test(T t) {
obj = t;
} public void test() {
obj.say();
}
} class Person {
public void say() {
}
}

仅仅有当我们明白了泛型的边界,这个时候obj才干调用相关的方法。

出现上面的原因主要是在编译期间,编译器不知道T详细的边界在哪里,须要制定边界,才干找到相应的类,从而检查是否包括相应方法。由于java里面的是伪泛型,在jvm层面是见不到參数类型的,因此必须在编译期间就已经检查类型安全。

2.当我们在同样类型或者具有继承关系类型的时候

引用我们上面的代码:

package com.ray.ch13;

public class Test<T extends Person> {

	private T obj;

	public Test(T t) {
obj = t;
} public void test() {
obj.say();
}
} class Person {
public void say() {
}
}

上面代码里面的泛型事实上不大起作用,并且添加了代码的阅读难度,事实上我们能够改动成以下的代码。功能是一样的:

package com.ray.ch13;

public class Test {

	private Person person;

	public Test(Person person) {
this.person = person;
} public void test() {
person.say();
}
} class Person {
public void say() {
}
}

改动过的代码更加简单明了。这个时候有人会说。上面的是extend。你这里没有,可是我们再添加一点东西看看:

package com.ray.ch13;

public class Test {

	private Person person;

	public Test(Person person) {
this.person = person;
} public void test() {
person.say();
} public static void main(String[] args) {
new Test(new Man()).test();
}
} class Person {
public void say() {
System.out.println("i am a person");
}
} class Man extends Person {
@Override
public void say() {
System.out.println("i am a man");
}
}

我们建立一个继承Person的类。然后一样能够把他放到里面进行方法调用。

3.笔者遇到的比較典型的泛型样例,就是使用泛型的dao

以下是引用别人的dao设计,

详细地址:http://blog.csdn.net/lazy_p/article/details/5599650

//通用DAO接口: 

package com.baiyyy.util.dao; 

import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria; /**
* 承有业务数据的基础訪问接口
* <p>
* 承有CRUD (创建。读取,改动和删陿)基本数据的操作在这个接口中都是独立的_ 并且承有的DAO都能够使用这些基本实玿
*
* @author yongtree
*
* @date:2008-03-04
*/
public interface IBaseDAO<T, ID extends Serializable> { /***************************************************************************
* -------------------基本棿索?添加?改动? 删除操使---------------------------- *
**************************************************************************/ // --------findById()方法是?过get(ID id)得到实体对象-----------------------
/**
* 通过ID来得到实体对豿
*
* @param id
* 实体对象的标识符
* @param lock
* 使用的锁模式
* @return 该主键忼相应的实体对象
*/
public T findById(ID id, LockMode lock); /**
* 通过ID来得到实体对豿
*
* @param id
* @return T
*/
public T findById(ID id); /**
* 通过ID来得到实体对豿(为兼容其它开发成员的原有程序。保留使甿)
*
* @param c
* @param id
* @return T
*/
public T findById(Class c, ID id); // -------------loadById()是调用hibernate的load方法------------ public T loadById(ID id); /**
* 通过id load对象
*
* @param id
* @param lock
* @return
*/
public T loadById(ID id, LockMode lock); /**
* 获取所有的实使
*
* @return
*/
public List<T> loadAll(); /**
* 保存丿个实体对豿
*
* @param entity
*/
public T saveEntity(T entity); /**
* 更新丿个实体对豿
*
* @param entity
*/
public void updateEntity(T entity); public void updateEntity(T entity, LockMode lock); /**
* 添加或更新集合中的所有实使
*
* @param entities
*/
public void saveOrUpdateAll(Collection<T> entities); /**
* 删除丿个实使
*
* @param entity
* @throws Exception
*/
public void deleteEntity(T entity); public void deleteEntity(T entity, LockMode lock); /**
* 依据主键删除指定实体
*
* @param id
*/
public void deleteEntityById(ID id); public void deleteEntityById(ID id, LockMode lock); /**
* 批量删除
*
* @param entities
*/
public void deleteAll(Collection<T> entities); /**
* 通过合并的方式更新对豿
*
* @param entity
* void
*/
public void merge(T entity); /***************************************************************************
* ------------------------------使用HQL语句-------------------------------- *
**************************************************************************/ /**
* 使用HQL语句进行对象的查诿
*
* @param hsql
* 查询语句
* @return 符合条件的对豿
*/ public T getEntity(String hsql); /**
* 使用HQL语句进行查询
*
* @param hsql
* 查询语句
* @return 符合条件的对象集吿
*/
public List<T> getEntities(String hsql); /**
* 使用带參数的HQL语句进行查询
*
* @param hsql
* @param obj
* @return
*/
public List<T> getEntities(String hsql, Object[] values); public List<T> getEntities(String hql, int start, int number); public List<T> getEntities(String hql, int start, int number,
Object[] values); /**
* 使用命名的HQL语句棿索数捿
*
* @param queryName
* @return
*/
public List<T> findByNamedQuery(String queryName); /**
* 使用带參数的命名HSQL语句棿索数捿
*
* @param queryName
* @param values
* @return
*/
public List<T> findByNamedQuery(String queryName, Object[] values); /**
* 使用带命名參数的命名HSQL语句棿索数捿
*
* @param queryName
* @param paramNames
* @param values
* @return
*/
public List<T> findByNamedQuery(String queryName, String[] paramNames,
Object[] values); /**
* 使用HQL语句棿索数据,返回 Iterator
*
* @param queryString
* @return
*/
public Iterator<T> iterate(String queryString); /**
* 使用带參数HSQL语句棿索数据。返回 Iterator
*
* @param queryString
* @param values
* @return
*/
public Iterator<T> iterate(String queryString, Object[] values); /***************************************************************************
* -----------------------------Criteria动濁查诿---------------------------- *
**************************************************************************/ /**
* 创建与会话无关的棿索标准对豿
*/
public DetachedCriteria createDetachedCriteria(); /**
* 创建与会话绑定的棿索标准对豿
*
* @return
*/
public Criteria createCriteria(); /**
* 使用指定的检索标准检索数捿
*
* @param criteria
* @return
*/
public List<T> findByCriteria(DetachedCriteria criteria); /**
* 使用指定的检索标准检索数据,返回部分记录
*
* @param criteria
* @param firstResult
* @param maxResults
* @return
*/
public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
int maxResults); /**
* 通过动濁查询条件进行查诿
*
* @param criterion
* @return List<T>
*/
@SuppressWarnings("unchecked")
public List<T> findByCriteria(Criterion... criterion); /**
* 使用指定的检索标准检索数据,返回指定范围的记彿
*
* @param criteria
* @return
*/
public Integer getRowCount(DetachedCriteria criteria); /**
* 使用指定的检索标准检索数据,返回指定统计倿
*
* @param criteria
* @param propertyName
* @param StatName
* (max,min,avg,sum)
* @return
*/
public Object getStatValue(DetachedCriteria criteria, String propertyName,
String StatName); /**
* 通过给定的一个对象,查找与其匹配的对象,表关联比較多时。用户能够自己依据霿要扩展?
*
* @param entity
* @return List<T>
*/
public List<T> findByExample(T entity); /***************************************************************************
* -------------------------Others ----------------------------------------*
**************************************************************************/ /**
* 加锁指定的实使
*
* @param entity
* @param lockMode
*/
public void lock(T entity, LockMode lockMode); /**
* 强制马上更新缓冲数据到数据库(否则仅在事务提交时才更新)
*/
public void flush(); /**
* 清空缓存
*
* void
*/
public void clear(); /***************************************************************************
* --------------------------------相关知识炿--------------------------------*
*
* 1、Session的load方法和get方法都是通过给定的ID从数据库中载入一个持久化的对象?但两个斿*
* 法的差别在于:当数据库不存在于ID相应的记录时。load()方法抛出异常,迌get()方法返回null*
***************************************************************************/ }

//通用Hibernate DAO实现: 

package com.baiyyy.util.dao; 

/**
* @filename:BaseHibernateDAO.java
*/ import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections; import com.baiyyy.workflow.pojo.TWfPackage; /**
* 用Hibernate实现通用DAO接口
*
* @author yongtree
* @date 2008-3-10
* @param <T>
* @param <ID>
*/
public class BaseHibernateDAO<T, ID extends Serializable> implements
IBaseDAO<T, ID> {
// 保持实体对象类的类型
private Class<T> persistentClass; private Session session; /**
* 构?方泿
*/
@SuppressWarnings("unchecked")
public BaseHibernateDAO() {
//以下这样的方式丿直有错误,不能得到真正的T.class,迌是Object.class
// this.persistentClass=GenericsUtils.getSuperClassGenricType(getClass());
// System.out.println(obj.getClass().getName());
} @SuppressWarnings("unchecked")
public BaseHibernateDAO(Class clazz) {
this.persistentClass = clazz;
} /**
* @param session
* the session to set
*/
public void setSession(Session session) {
this.session = session;
} /**
* 得到当前线程的Session对象的实便
*
* @return
*/
protected Session getSession() {
System.out.println("get session");
return HibernateUtil.getCurrentSession();
} /**
* 得到持久化对象的类型
*
* @return 持久化类的类垿
*/
protected Class<T> getPersistentClass() {
return persistentClass;
} @SuppressWarnings("unchecked")
public T findById(ID id, LockMode lock) {
// TODO Auto-generated method stub
T entity = (T) getSession().get(getPersistentClass(), id, lock);
if (entity != null) {
this.flush();
} return entity;
} @SuppressWarnings("unchecked")
public T findById(Class c, ID id) {
// TODO Auto-generated method stub
T entity; entity = (T) getSession().get(c, id); return entity;
} @SuppressWarnings("unchecked")
public T findById(ID id) {
// TODO Auto-generated method stub
T entity = (T) getSession().get(getPersistentClass(), id); return entity;
} @SuppressWarnings("unchecked")
public T loadById(ID id) {
// TODO Auto-generated method stub
T entity = (T) getSession().load(getPersistentClass(), id);
return entity;
} @SuppressWarnings("unchecked")
public T loadById(Class c, ID id) {
// TODO Auto-generated method stub
T entity = (T) getSession().load(c, id);
return entity;
} @SuppressWarnings("unchecked")
public T loadById(ID id, LockMode lock) {
// TODO Auto-generated method stub
T entity = (T) getSession().load(getPersistentClass(), id, lock);
return entity;
} @SuppressWarnings("unchecked")
public List<T> loadAll() {
List<T> list = getSession().createQuery(
"from " + getPersistentClass().getName()).list();
return list;
} public T saveEntity(T entity) {
// TODO Auto-generated method stub getSession().save(entity);
this.flush();
return entity;
} public void updateEntity(T entity) {
// TODO Auto-generated method stub
getSession().saveOrUpdate(entity);
this.flush();
} /**
* 该实现类临时没有实现更新加锁的操使
*/
public void updateEntity(T entity, LockMode lock) {
// TODO Auto-generated method stub
getSession().saveOrUpdate(entity);
this.flush();
} public void saveOrUpdateAll(Collection<T> entities) {
getSession().saveOrUpdate(entities);
this.flush();
} public void deleteEntity(T entity) {
// TODO Auto-generated method stub
getSession().delete(entity);
this.flush();
} /**
* 该实现没有实现加锁删除对象的操作。在spring的DAO实现中已经实玿
*/
public void deleteEntity(T entity, LockMode lock) {
// TODO Auto-generated method stub
getSession().delete(entity);
this.flush();
} public void deleteEntityById(ID id) {
this.deleteEntity(this.loadById(id));
this.flush();
} // 该实现没有实现加锁的删除,在spring的dao中已经实现了
public void deleteEntityById(ID id, LockMode lock) {
this.deleteEntity(this.loadById(id));
this.flush();
} public void deleteAll(Collection<T> entities) {
this.flush();
getSession().delete(entities);
} public void merge(T entity){
getSession().merge(entity);
this.flush();
} @SuppressWarnings("unchecked")
public T getEntity(String hsql) {
T uniqueResult = (T) getSession().createQuery(hsql).uniqueResult();
// TODO Auto-generated method stub
return uniqueResult;
} @SuppressWarnings("unchecked")
public List<T> getEntities(String hsql) {
// TODO Auto-generated method stub List list = getSession().createQuery(hsql).list();
return list;
} @SuppressWarnings("unchecked")
public List<T> getEntities(String hql, int start, int number,
Object[] values) {
// TODO Auto-generated method stub
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
query.setFirstResult(start);
query.setMaxResults(number);
List list = query.list();
return list;
} @SuppressWarnings("unchecked")
public List<T> getEntities(String hql, int start, int number) {
// TODO Auto-generated method stub
Query query = getSession().createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(number);
List list = query.list();
return list;
} @SuppressWarnings("unchecked")
public List<T> getEntities(String hql, Object[] values) {
// TODO Auto-generated method stub
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
return query.list();
} @SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName) {
// TODO Auto-generated method stub
return getSession().getNamedQuery(queryName).list();
} @SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName, Object[] values) {
// TODO Auto-generated method stub
Query query = getSession().getNamedQuery(queryName);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values);
}
return query.list();
} /**
* 注意:该方法是?过设置參数来进行命名查询,承以在传參数时,一定要注意paramNames和values的长度,位置要一丿相应?
*/
@SuppressWarnings("unchecked")
public List<T> findByNamedQuery(String queryName, String[] paramNames,
Object[] values) {
// TODO Auto-generated method stub
Query query = getSession().getNamedQuery(queryName);
for (int i = 0; i < paramNames.length; i++) {
query.setParameter(paramNames[i], values[i]);
}
return query.list();
} @SuppressWarnings("unchecked")
public Iterator<T> iterate(String hql) {
// TODO Auto-generated method stub
return getSession().createQuery(hql).iterate();
} @SuppressWarnings("unchecked")
public Iterator<T> iterate(String hql, Object[] values) {
// TODO Auto-generated method stub
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
return query.iterate();
} public DetachedCriteria createDetachedCriteria() {
// TODO Auto-generated method stub
return DetachedCriteria.forClass(this.persistentClass);
} public Criteria createCriteria() {
// TODO Auto-generated method stub
return this.createDetachedCriteria().getExecutableCriteria(
this.getSession());
} /**
* 该方法没有经过验证,不能保证正确,在spring的实现中已经实现亿
*/
@SuppressWarnings("unchecked")
public List<T> findByCriteria(DetachedCriteria criteria) {
// TODO Auto-generated method stub
return criteria.getExecutableCriteria(this.getSession()).list();
} @SuppressWarnings("unchecked")
public List<T> findByCriteria(DetachedCriteria criteria, int firstResult,
int maxResults) {
// TODO Auto-generated method stub
return criteria.getExecutableCriteria(this.getSession())
.setFirstResult(firstResult).setMaxResults(maxResults).list(); } /**
* 动濁查诿
*
* @param criterion
* @return
*/
public @SuppressWarnings("unchecked")
List<T> findByCriteria(Criterion... criterion) {
Criteria crit = getSession().createCriteria(getPersistentClass());
for (Criterion c : criterion) { if (c != null) { crit.add(c); }
}
List list = crit.list();
return list;
} @SuppressWarnings("unchecked")
public Integer getRowCount(DetachedCriteria criteria) {
// TODO Auto-generated method stub
criteria.setProjection(Projections.rowCount());
List list = this.findByCriteria(criteria, 0, 1);
return (Integer) list.get(0); } @SuppressWarnings("unchecked")
public Object getStatValue(DetachedCriteria criteria, String propertyName,
String StatName) {
// TODO Auto-generated method stub
if (StatName.toLowerCase().equals("max"))
criteria.setProjection(Projections.max(propertyName));
else if (StatName.toLowerCase().equals("min"))
criteria.setProjection(Projections.min(propertyName));
else if (StatName.toLowerCase().equals("avg"))
criteria.setProjection(Projections.avg(propertyName));
else if (StatName.toLowerCase().equals("sum"))
criteria.setProjection(Projections.sum(propertyName));
else
return null;
List list = this.findByCriteria(criteria, 0, 1);
return list.get(0);
} @SuppressWarnings("unchecked")
public List<T> findByExample(T exampleInstance) {
// TODO Auto-generated method stub
Criteria crit = getSession().createCriteria(getPersistentClass());
Example example = Example.create(exampleInstance);
example.ignoreCase().enableLike(MatchMode.ANYWHERE);// 忽略大写和小写。并进行模糊比辿
example.excludeZeroes();// 对于属濧中有数字类型的,假设exampleInstance的属性忼为0,就把它加入到查询中
crit.add(example);
return crit.list(); } public void lock(T entity, LockMode lockMode) {
// TODO Auto-generated method stub
getSession().lock(entity, lockMode);
} public void flush() {
// TODO Auto-generated method stub
getSession().flush();
} public void clear() {
// TODO Auto-generated method stub
getSession().clear();
} }

总结:这一章节主要讨论一下什么时候使用泛型。

这一章节就到这里,谢谢。

-----------------------------------

文件夹

从头认识java-13.7 什么时候使用泛型?的更多相关文章

  1. Java 13 明天发布,最新最全新特性解读

    2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网上已经可以看到JDK 13的进展,最新版的JDK ...

  2. Spring Boot 2.2 正式发布,大幅性能提升 + Java 13 支持

    之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟.这次随着 Spring Framework 5.2.0 成功发布之后,Spring ...

  3. Java 9 ← 2017,2019 Java → 13 ,都发生了什么?

    距离 2019 年结束,只剩下 35 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天, 的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈 ...

  4. Java 9 ← 2017,2019 → Java 13,来看看Java两年来的变化

    距离 2019 年结束,只剩下 33 天了.你做好准备迎接 2020 年了吗? 一到年底,人就特别容易陷入回忆和比较之中,比如说这几天的对比挑战就火了! 这个话题登上了微博的热搜榜,也刷爆了朋友圈, ...

  5. Java 13 特性解读

    Java 13 特性解读    转 https://blog.csdn.net/bjweimengshu/article/details/100978383   2017年8月,JCP执行委员会提出将 ...

  6. Java 13新特性

    switch表达式 switch表达式是Java 12开始就提供的预览特性,到了Java 13仍然没有被转正.此特性可以把switch的执行结果组合到复合表达式中进行运算. import java.t ...

  7. 2019年9月17 发布 Java 13

    Java 13 明天发布,最新最全新特性解读   2017年8月,JCP执行委员会提出将Java的发布频率改为每六个月一次,新的发布周期严格遵循时间点,将在每年的3月份和9月份发布. 目前,JDK官网 ...

  8. Java 13 发布了!

    点击上方蓝色链接,关注并"设为星标" Java干货,每天及时推送 通告一下,Java 13 09/17 发布了,尝鲜地址: https://www.oracle.com/techn ...

  9. Java 13 在win10 安装及配置

    java 13 SDK 下载 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538 ...

  10. Java 13 即将发布,新特性必须抢先看!

    作者:h4cd 本文转载自开源中国(ID:oschina2013) 由于 Java 现在采取"半年发布一次新版本"的模式,所以 Java 12 的下一个版本 Java 13/JDK ...

随机推荐

  1. 左耳听风 ARTS Week 001

    要求:1.每周至少做一个 leetcode 的算法题 2.阅读并点评至少一篇英文技术文章 3.学习至少一个技术技巧 4.分享一篇有观点和思考的技术文章 1.每周至少做一个 leetcode 的算法题 ...

  2. centos上安装supervisor来管理dotnetcore等应用程序

    supervisor 介绍: 这是一款用python编写的进程管理工具,可以守护他管理的所有进程,防止异常退出,以及提供一个可视化的web界面来手动管理,打开关闭重启各种应用,界面如下: 关于在cen ...

  3. 三维CNN:收集一些最近的3d卷积网络PointNet++

    PointNet++是在PointNet上做出了改进,考虑了点云局部特征提取,从而更好地进行点云分类和分割. 先简要说一下PointNet: PointNet,其本质就是一种网络结构,按一定的规则输入 ...

  4. 世界上最受欢迎的10个Linux发行版

    帮助新的Linux用户在越来越多的Linux发行版中选择最合适的操作系统,是创建这个网页的原因.它列出了迄今为止最流行的10个Linux发行版(另外增加的是FreeBSD,到目前为止最为流行的BSD系 ...

  5. (转)淘淘商城系列——Redis持久化方案

    http://blog.csdn.net/yerenyuan_pku/article/details/72858975 Redis中设置key的过期时间 Redis中的expire命令用于设置key的 ...

  6. Queries for Number of Palindromes(求任意子列的回文数)

    H. Queries for Number of Palindromes time limit per test 5 seconds memory limit per test 256 megabyt ...

  7. PHP图像函数

    (1)常见的验证码哪些?   图像类型.语音类型.视频类型.短信类型等 (2)使用验证码的好处在哪里? ①防止恶意的破解密码如一些黑客为了获取到用户信息,通过不同的手段向服务器发送数据,验证猜测用户信 ...

  8. Luogu P2176 [USACO14FEB]路障Roadblock

    解题思路 这是一道最短路题目,不知道大家有没有做过玛丽卡这道题目,如果没做,在做完这道题之后可以去拿个双倍经验哦 先求出一张图中的最短路径,并将其记录下来,我们首先思考:要有增量的前提是新的最短路径比 ...

  9. OpenCV+Python识别车牌和字符分割的实现

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  10. Spring 源码学习(一)

    工作好多年了,越来越心浮气躁了,好多东西都是一知半解的,所以现在需要静下心来好好学习一门技术. 就选Spring了, spring 设计java 开发的方方面面. 期待目标 对Spring 有个更深层 ...