Java cast异常一直随机出现(先能cast,后不能)

Java cast exception keeps randomly appearing(first it can cast, after it cant)

protected List query(String condition) {

    String queryString = "FROM Worker";
    System.out.println("adding to query");
    if (condition != null) {
        queryString += " " + condition;
        System.out.println(condition);
    }
    System.out.println("added to query");
    Query query = em().createQuery(queryString);
    System.out.println("created query");

    System.out.println("starting query");
    List < Radnik > c = query.getResultList();

    System.out.println(c.size());

    List < WorkerBean > result = new ArrayList < WorkerBean > ();
    System.out.println("before for");
    if (c instanceof List <? > ) {
        System.out.println("YES!");
        for (Object obj: c) {
            System.out.println("entered!!!");
            System.out.println(c.get(0).getClass());
            if (obj instanceof Worker) {
                System.out.println("it's a worker");
            }
            Workerentity = (Worker) obj;
            result.add(EntityToBean(entity));
        }
        c.clear();
        System.out.println("out of for");

    }

    return result;
}

所以困扰我和办公室里所有其他人的事情是,在第一次调用这个查询时它没有问题(完整的工作人员列表),但是当我第二次调用时(与一些参数)它说列表大小符合我的预期但抛出

 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to.

所以综上所述无法进行第二次投射(@System.out.println(c.get(0).getClass());

考虑注意细节。

 if (obj instanceof Worker) {
     System.out.println("it's a worker");
 }

 Workerentity = (Worker) obj;

无论 obj 是 Worker 的实例,都会尝试将 obj 转换为 Worker。

将强制转换移到 if 语句块内。

所以一天后又来了,然后重新启动了几次(我当时很绝望)。现在一切正常。这不是第一次发生在我身上(可能是一些垃圾收集器等) 谢谢你们的努力:)

当您忽略与泛型相关的编译器警告时,往往会发生神秘的 ClassCastExceptions。打开所有编译器警告,并确保解决它们。特别是,不要使用原始类型(例如没有通用类型的 List),也不要调用使用或 return 原始类型的方法。

通过正确使用泛型,您的方法可以缩短为:

protected List<WorkerBean> query(String condition) {

    String queryString = "FROM Worker";
    System.out.println("adding to query");
    if (condition != null) {
        queryString += " " + condition;
        System.out.println(condition);
    }
    System.out.println("added to query");

    TypedQuery<Radnik> query = em().createQuery(queryString, Radnik.class);
    System.out.println("created query");

    System.out.println("starting query");
    List < Radnik > c = query.getResultList();

    System.out.println(c.size());

    List < WorkerBean > result = new ArrayList < WorkerBean > ();
    for (Radnik obj: c) {
        result.add(EntityToBean(obj));
    }

    return result;
}

注意使用 TypedQuery 而不是查询。

只要您的代码不生成编译器警告,一般类型的列表就保证包含正确类型的对象,因此无需检查结果列表的有效性。

所以要更新,我有一个对象列表,因为它没有具体说明我应该 select,并且 FROM 部分有多个表! :虚拟