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

2年前 (2022) 程序员胖胖胖虎阿
1,219 0 0

问题描述

今天继承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. 类型不符合的情况,可以检查一下泛型是否指定错误了。

相关文章

暂无评论

暂无评论...