论坛首页 入门技术论坛

为什么运行时取不到泛型T,难道你们觉得没必要吗

浏览 15115 次
该帖已经被评为新手帖
作者 正文
   发表时间:2012-01-31   最后修改:2012-01-31
public <T> Object executeQuery(MybatisCallBack<T> callback){

   。。。。。。。。。。。。
}

这是小弟的代码。我想在方法内部取得方法签名里MybatisCallBack<T> callback 的类型T的类型和类型名,一直
找不到可以取的T的方法,

无奈之下多放了一个参数进来
public <T> Object executeQuery(MybatisCallBack<T> callback, Class<T> type){
。。
}
   发表时间:2012-01-31  
我现在的项目需要引入mybatis,于是我需要对mybatis进行一些封装,如上描述的,我觉得运行时完全有必要取的T类型,而不需要引入一个额外的参数来指明T的ClassType。但是我无法获取到,是不支持还是怎么滴
0 请登录后投票
   发表时间:2012-01-31  
先确定你是否真的需要类型T的类型和类型名吧
0 请登录后投票
   发表时间:2012-01-31  
gtssgtss 写道
先确定你是否真的需要类型T的类型和类型名吧

当然确定,不然我还引入一个额外的方法参数干嘛
0 请登录后投票
   发表时间:2012-01-31  
这么说吧,我设计的思路是需要T来得到我的mybatis的mapper来放在模板方法里调用
0 请登录后投票
   发表时间:2012-01-31  
如果需要创建对象,Class就必须要
如果你要调用的api要Class,Class就必须要
否则Class要来干什?ArrayList有多少地方用了Class?
看不到你的实现,也就没法确定你是否真的需要那东西
0 请登录后投票
   发表时间:2012-01-31  
gtssgtss 写道
如果需要创建对象,Class就必须要
如果你要调用的api要Class,Class就必须要
否则Class要来干什?ArrayList有多少地方用了Class?
看不到你的实现,也就没法确定你是否真的需要那东西


public class MybatisMapperTemplate {

	private static ThreadLocal<SqlSession> sessions = new ThreadLocal<SqlSession>();

	private MybatisMapperTemplate() {
	}

	public static MybatisMapperTemplate getInstance() {

		return new MybatisMapperTemplate();
	}

	/**
	 * 调用mybatis进行查询的入口类的入口方法。所有查询都由该类的该方法发起
	 * 
	 * @Title: doInMybatisMapperCallBack
	 * 
	 * @Description: 使用方法:
	 *               MybatisMapperTemplate.getInstance().executeQuery
	 * 
	 * @param
	 * @param <T>
	 * @param
	 * @param callback
	 * @param
	 * @param type
	 *            XXMapper.class
	 * 
	 * @return void 返回类型
	 * @throws Exception
	 * 
	 * @throws
	 */
	public <T> Object executeQuery(MybatisCallBack<T> callback, Class<T> type)
			throws Exception {

		/**
		 * 查询结果集可能是List,可能是单条实体记录,所以不做泛型,统一用Object来接收和返回
		 */
		Object obj = null;
		
		
		try {
			obj = callback.doInMybatis(this.mapper(type));
		} catch (Exception e) {
			TracingHelper.errorLog(MybatisMapperTemplate.class, e.getMessage(),
					e);
			e.printStackTrace();
			throw e;
		} finally {
			this.closeSession();
		}
		
		return obj;
	}

	/**
	 * 释放session,该方法不被外部调用。仅在模板方法内调用
	
	* @Title: closeSession 
	
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	
	* @param     设定文件 
	
	* @return void    返回类型 
	
	* @throws
	 */
	private void closeSession() {
		// TODO Auto-generated method stub
		SqlSession session = sessions.get();
		TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession()",
				"session begin closing ..");
		if(session != null)
		{
			session.close();
			TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession()",
					"session has already closed ..");
		}
		else{
			
			TracingHelper.infoLog(MybatisMapperTemplate.class, "closeSession",
			"session is null ..");
		}
	}

	/**
	 * 获取接口及XML的映射Mapper类,对外封闭
	
	* @Title: mapper 
	
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	
	* @param @param <T>
	* @param @param type
	* @param @return    设定文件 
	
	* @return T    返回类型 
	
	* @throws
	 */
	private <T> T mapper(Class<T> type) {
		// TODO Auto-generated method stub
		TracingHelper.infoLog(MybatisMapperTemplate.class, "mapper()",
				"get mybatis mapper..");
		return getMapper(type);
	}

	/**
	 * 扩展Mybatis原生获取session的方法。对外封闭
	
	* @Title: getMapper 
	
	* @Description: TODO(这里用一句话描述这个方法的作用) 
	
	* @param @param <T>
	* @param @param type
	* @param @return    设定文件 
	
	* @return T    返回类型 
	
	* @throws
	 */
	private <T> T getMapper(Class<T> type) {

		SqlSessionFactory ssf = null ;
		SqlSession sqlSession = null ;
		
		try{
			ssf = SessionFactory.getSqlSessionFactory();
			sqlSession = ssf.openSession();
			sessions.set(sqlSession);
		}catch(Exception e){
			e.printStackTrace();
		}
		
		
		return sqlSession.getMapper(type);
	}



public interface MybatisCallBack<T> {

	
	public Object doInMybatis(T mapper);
	
	
}




简而言之就是需要T来得到Mapper的具体类型
0 请登录后投票
   发表时间:2012-01-31  
不支持呗。
TIJ的泛型一章有详细的解释。
0 请登录后投票
   发表时间:2012-01-31   最后修改:2012-01-31
既然是api要用Class的话,那自然需要咯
实在要取的话,看看这个
http://www.iteye.com/topic/585900
你会发现,你取得到的时候没必要,有必要的时候取不到--
0 请登录后投票
   发表时间:2012-01-31  
不支持。Java 泛型的支持不是太好。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics