List<TaclUserinfo> list = calcPage(hqluser1.toString(), pageContext, taclRole.getRoleid(), taclRole.getTenantId()); //返回值类型 是<T>List<T>的,j接收的时候,我直接用List<具体类>
3 :类或者接口使用泛型 interface Collection<V> {..}上边的HashMap代码中,也看到了在类上使用泛型的具体例子。在真正的项目上,一些基础的公共类经常定义泛型,如下:
1 public interface GenericDao<T, ID extends Serializable> { 2 3 public abstract void saveOrUpdate(T t) throws DataAccessException; 4 5 public abstract T get(ID id) throws DataAccessException; 6 7 public abstract List<T> query(String queryString) throws DataAccessException; 8 9 public abstract Serializable save(T t) throws DataAccessException; 10 11 public abstract void saveOrUpdateAll(Collection<T> entities) throws DataAccessException; 12 13 public abstract List<T> loadAll() throws DataAccessException; 14 15 public abstract void merge(T t) throws DataAccessException; 16 17 }
接口的实现类: 传入参数为T,实现类中也可以继续用T,返回为T也可以用T;实现的时候 可以用 extends限定泛型的边界。
public abstract class GenericDaoImpl<T extends BaseEntity, ID extends Serializable> extends HibernateDaoSupport implements GenericDao<T, ID> { public void merge(T t) throws DataAccessException { TenantInterceptor.setTenantInfoToEntity(t); getHibernateTemplate().merge(t); } public T get(ID id) throws DataAccessException { // getHibernateTemplate().setCacheQueries(true); T load = (T) getHibernateTemplate().get(getEntityClass(), id); return load; } }
具体使用的时候:
public class UserDao extends GenericDaoImpl<User, Serializable> { ...//比如get() merge()这些方法不需要在单独编写,直接调用 }
4: 声明带边界的泛型 class userDao<T extends BaseEntity>Java中泛型在运行期是不可见的,会被擦除为它的上级类型。如果你是无界的泛型参数类型,就会被替换为Object.
public class RedColored<T extends Color> { public T t; public void color(){ t.getColor();//T的边界是Color,所以可以调用getColor(),否则会编译报错 } } abstract class Color{ abstract void getColor(); }
类似这样的定义形式:GenericDaoImpl<T extends BaseEntity, ID extends Serializable> ,java重载了extends,标注T的边界就是BaseEntity。如果需求是继承基类,那么边界定义在子类上
类似
class Colored2<T extends Color> extends RedColor<T>
5:用于通配符 <?>