【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;
}
}
编译成功!
最后再改一下返回值就好了就好了
总结:
- Mybatis可以使用一个简单的XML配置文件或者Annotation来配置和匹配实体。
- 在Mybatis-Plus中,也可以通过继承BaseMapper< T >,并在泛型T中指定实体的类型匹配接口和实体。
- 遇到错误要仔细看报错,如果报错不明显,可以运行一下看详细错误,找到反常的地方。
- 类型不符合的情况,可以检查一下泛型是否指定错误了。
版权声明:程序员胖胖胖虎阿 发表于 2022年9月14日 上午9:56。
转载请注明:【Mybatis-Plus】【异常】Inferred type ‘E‘ for type parameter ‘E‘ is not within its bound; | 胖虎的工具箱-编程导航
转载请注明:【Mybatis-Plus】【异常】Inferred type ‘E‘ for type parameter ‘E‘ is not within its bound; | 胖虎的工具箱-编程导航
相关文章
暂无评论...