通用列表上的ClassCastException retriving元素

时间:2016-02-22 16:36:49

标签: java generics

我有以下条款:

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对象列表。这是泛型声明中的某种问题,但我无法确定它。有什么想法吗?

1 个答案:

答案 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中找到的那样。