mybatis查询返回List泛型问题

项目场景:

查询一个列表数据。今天项目中意外的发现一个令人很惊讶的问题如下:


问题描述:

Contoller定义返回的是ListCoupletFASAlarmOutData>数据

1、Controller的代码:

    @RequestMapping("/getFASAlarmList")
    public Json getFASAlarmList(HttpServletRequest request,@RequestBody FrontCentreInData inData){
        Json json = new Json();
        try {
            List<FrontAlarmListOutData> outData = frontCenterIndexService.getFASAlarmList(inData.getStationId());
            json.setObj(outData);
            json.setSuccess(true);
        }catch (ServiceException e) {
            log.error(e.getMessage());
            json.setMsg(e.getMessage());
        } catch(Exception e) {
            e.printStackTrace();
            json.setMsg(e.getMessage());
        }
        return json;
    }

2、serviceImpl实现类代码:

@Override
    public List<FrontAlarmListOutData> getFASAlarmList(String stationId) throws Exception {
        return lwFasAlarmMapper.getAlarmList(stationId);
    }

3、mapper数据库接口代码:

    List<FrontAlarmListOutData> getAlarmList(@Param("stationId") String stationId);

4、xml文件代码:

<select id="getAlarmList" resultType="com.gw.frontstage.couplet.data.CoupletFASAlarmOutData">
		SELECT
			a.id,
			a.last_update,
			a.alarm_source_desc
			FROM
			ut_lw_fas_alarm a
		left join ut_base_station b ON a.station_id = b.id
		WHERE
			a.is_deal = 0
		<if test="stationId!=null and stationId!=''">
			and (b.id = #{stationId} or b.parent_id = #{stationId})
		</if>
		order by a.last_update desc
		limit 200
	</select>

CoupletFASAlarmOutData对象和FrontAlarmListOutData对象没有任何关系。但数据接口最后调用返回的结果是ListCoupletFASAlarmOutData>这个结果,令人费解

原因分析:

原因是java中有泛型擦除这一概念。如果不太了解这一概念的同学可以自己找一下度娘。(简单来说:就是如果使用了泛型,在编译期的时候泛型会被擦除掉,也就是说jvm所看到的class文件中是不存在泛型这一概念和东西的)。可以使用Beyond Compare进行反编译查看

泛型在编译期会被擦除的结论是没有问题的,在jvm中不存在泛型的概念。但是反编译工具通过注释中的记录找到了之前使用过的泛型类型,并在反编译时将其添加回来,所以我们所看到的反编译的文件中泛型存在,好像与泛型擦除这一概念冲突了。然而事实证明并没有,只是反编译工具太智能了而已。


解决方案:

为了避免这样疑问,因此xml中resultType最好和mapper数据接口保持一致的对象
个人理解:泛型只在编译的时候有用,编译完后的class 文件,jvm运行 是不管泛型的

你可能感兴趣的:(JAVA)