2009-04-25 51 views
9

Tôi nhận được sau cảnh báo:cảnh báo: [kiểm soát] không được kiểm soát chuyển đổi

warning:[unchecked] unchecked conversion 
[javac]found:java.util.List 
[javac] required:java.util.List<edu.fullerton.cs476s09.espressobar.jpa.espressobar_milk> 
return query.getResultList(); 

gì có thể các vấn đề có thể xảy ra và giải pháp. Tôi đang sử dụng mã sau:

@Stateless 
@Remote(Order.class) 
//@EntityListeners(MyListener.class) 
public class OrderBean implements Order 
{ 
    /** 
    * The entity manager object, injected by the container 
    */ 

    @PersistenceContext 

    private EntityManager manager; 

    public List<espressobar_milk> listMilk() 
    { 
     Query query = manager.createQuery("SELECT m FROM espressobar_milk m"); 
     return query.getResultList(); 
    }... 
..... 
..} 

Cảm ơn bạn trước mọi đề xuất.

Trả lời

11

Vâng, chúng tôi không có chi tiết về những gì Query có ở đây, nhưng có lẽ phương thức getResultList của nó trả về một số List. Về cơ bản trình biên dịch không thể chắc chắn rằng danh sách được trả về bởi getResultList sẽ chỉ chứa các trường hợp espressobar_milk (nó hơi tinh tế hơn một chút, nhưng chúng tôi sẽ để nó ở đó bây giờ).

Bạn có thể thử để làm cho nó mạnh mẽ gõ, có lẽ bằng cách thay đổi lớp Query, hoặc bạn có thể chú thích các phương pháp với

@SuppressWarnings("unchecked") 

nếu bạn tin đó là đúng nhưng không có cách nào để đạt được thời gian biên dịch an toàn.

+1

Lưu ý, tôi vẫn nhận được cảnh báo khi tôi chú thích phương thức trong Java 1.7.Tuy nhiên, cảnh báo đã thực sự bị chặn khi tôi chú thích toàn bộ lớp. – Cerin

2

Có lẽ kết quả của

return query.getResultList(); 

List và không List<E>, vì nó được mong đợi (List<espressobar_milk>). [http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html] Đó là lý do nó hiển thị cảnh báo. Trong mọi trường hợp, bạn có thể ngăn chặn cảnh báo này bằng cách sử dụng:

@SuppressWarnings ("unchecked") 
public List<espressobar_milk> listMilk() 
{ 
    Query query = manager.createQuery("SELECT m FROM espressobar_milk m"); 
    return query.getResultList(); 
} 
1

Cảnh báo chuyển đổi không được kiểm soát thường là kết quả của cơ chế xóa của Java cho Generics. Ý tưởng là mã sử dụng generics có thể hợp tác với mã không sử dụng generics (trên thực tế, mã được tạo ra bỏ qua kiểu generic).

Tuy nhiên, bạn cũng nhận được cảnh báo này khi bạn cố gắng "tiếp tục" tính chung cho một danh sách không chung chung (vì điều này khác với một diễn viên dựa trên lớp sẽ ném ClassCastException). Trong trường hợp này, cố gắng để tack vào loại sữa để một danh sách không chung chung trở lại bởi getResultList sản xuất lỗi là gì.

Đọc số Java Generics tutorial để biết thêm thông tin về điều này.

3

Có vẻ như bạn đang sử dụng Hibernate, hiện đang triển khai JPA 1.0 (Hy vọng Hibernate sẽ triển khai JPA 2.0 khi nó được phát hành. (Toplink hiện là triển khai tham chiếu của JPA 2.0)). Hibernate không sử dụng bất kỳ tính năng java 1.5 nào và do đó không có bộ sưu tập chung nào có sẵn.

1
@SuppressWarning ("unchecked") 

nên là:

@SuppressWarnings("unchecked") 
10

Tôi đang sử dụng EJB 3.1 và tôi đã có cùng một vấn đề. Tôi đã tìm thấy một giải pháp khác:

TypedQuery<espressobar_milk> query = manager.createQuery("SELECT m FROM espressobar_milk m", espressobar_milk.class);   
return query.getResultList(); 

Điều này giải quyết cảnh báo cuộc trò chuyện không được kiểm tra (bạn không cần chú thích @SuppressWarnings nữa).

Các vấn đề liên quan