【Mybatis-Plus】【异常】Inferred type ‘E‘ for type parameter ‘E‘ is not within its bound;

问题描述

今天继承Mybatis-Plus里面的BaseMapper做的Dao层接口,实现selectPage()方法,但是一直报异常,代码和报错信息如下:

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryDao categoryDao;

    @Override
    public IPage<Category> findPage(PageAndQuery p) {
        IPage<Category> page= new Page<>(p.getPage(),p.getPageSize());
        //正常来说,这里应该返回一个IPage<Category>类型的对象,但是返回的却是一个类型E e
        //鼠标悬停,报错信息如下:Inferred type 'E' for type parameter 'E' is not within its bound; should implement 'com.baomidou.mybatisplus.core.metadata.IPage<com.itheima.dao.CategoryDao>'
        E e = categoryDao.selectPage(page, null);
        //这里忽略,因为上面已经有问题了,所以不往下返回值了
        return null;
    }
}

我很奇怪,是不是这个方法不能传null的参数呢?于是我去查看了源码:

/**
     * 根据 entity 条件,查询全部记录(并翻页)
     * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

源码说这个方法可以为空,那就不是参数的问题。
于是我运行了一下程序,想要得到更详细的提示,报错结果如下:

Error:(23, 26) java: 无法将接口 com.baomidou.mybatisplus.core.mapper.BaseMapper<T>中的方法 selectPage应用到给定类型;
  需要: E,com.baomidou.mybatisplus.core.conditions.Wrapper<com.itheima.dao.CategoryDao>
  找到: com.baomidou.mybatisplus.core.metadata.IPage<com.itheima.bean.Category>,<nulltype>
  原因: 推断类型不符合上限
    推断: com.baomidou.mybatisplus.core.metadata.IPage<com.itheima.bean.Category>
    上限: com.baomidou.mybatisplus.core.metadata.IPage<com.itheima.dao.CategoryDao>

报错第2-3行显示:需要CategoryDao,找到Category,所以类型不匹配
我就很奇怪,这里要的不是实体类Category吗?怎么会去找CategoryDao接口呢?于是我去接口文件看了一下,代码如下:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface CategoryDao extends BaseMapper<CategoryDao> {
}

额,原来是犯了一个低级错误,把BaseMapper里面的类型写成CategoryDao接口了,这个类型应该写实体类Category的。
修改代码如下:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itheima.bean.Category;

public interface CategoryDao extends BaseMapper<Category> {
}
---------------------------------------------------------------------------------------

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryDao categoryDao;
    @Override
    public IPage<Category> findPage(PageAndQuery p) {
        IPage<Category> page= new Page<>(p.getPage(),p.getPageSize());
        IPage<Category> iPage = categoryDao.selectPage(page, null);
        return null;
    }
}

编译成功!
最后再改一下返回值就好了就好了


总结:

  1. Mybatis可以使用一个简单的XML配置文件或者Annotation来配置和匹配实体。
  2. 在Mybatis-Plus中,也可以通过继承BaseMapper< T >,并在泛型T中指定实体的类型匹配接口和实体。
  3. 遇到错误要仔细看报错,如果报错不明显,可以运行一下看详细错误,找到反常的地方。
  4. 类型不符合的情况,可以检查一下泛型是否指定错误了。
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值