我有以下条款:
public class PagedResult<T>
{
private Integer count;
private Integer pageSize;
private Integer pageNumber;
private Integer numPages;
private List<T> result;
...
}
public class AbstractDAO <T>
{
protected PagedResult<T> getPagedResult( String jpqlBusqueda, String jpqlCuenta, List<Object> parameters, Integer page, Integer pageSize, boolean isNative )
{
...
}
}
public class RecipeDAO extends AbstractDAO<Recipe>
{
PagedResult<Recipe> search()
{
return getPagedResult( "aaaa", "aaaaa", ...);
}
...
}
当我使用这个从BBDD中检索配方对象列表时,一切都可以正常运行,直到我尝试访问结果列表中的单个对象,如下所示:
PagedResult<Recipe> result = RecipeDAO.search(...);
Recipe theRecipe = result.getResult().get(0);
在这一点上,我得到一个ClassCastException,声称Object无法转换为Recipe。我尝试调试并在获取对象之前停止程序,netbeans调试器显示PagedResult对象包含Recipe对象列表。这是泛型声明中的某种问题,但我无法确定它。有什么想法吗?
答案 0 :(得分:0)
我发现了问题。最后,它不是在泛型构造中,而是在jpa部分。显然,当您调用em.createNativeQuery(nativeQuery)时,结果是它是一个无法传递给Recipe的泛型类型的列表。为了做到这一点,你需要调用em.createNativeQuery(nativeQuery,resultClass),其中resultClass它的配方在我的情况下。
为了使dinCically获得resultClass所以所有都保持通用和可重用,我们可以这样做:
Class<T> resultClass = ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
正如我在excelent post中找到的那样。