2009-04-25 12 views
9

sto ottenendo seguente avviso:avvertimento: [incontrollato] conversione incontrollato

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

quello che può la soluzione del problema e probabile. Sto usando il codice seguente:

@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(); 
    }... 
..... 
..} 

Grazie in anticipo per qualsiasi suggerimento.

risposta

11

Bene, non abbiamo i dettagli di ciò che Query è qui, ma presumibilmente il suo metodo restituisce un grezzo List. Fondamentalmente il compilatore non può essere sicuro che la lista restituita da contenga solo istanze di espressobar_milk (è leggermente più sottile di quella, ma la lasceremo lì per ora).

Si potrebbe provare a renderlo fortemente tipizzato, probabilmente cambiando la classe Query, o si potrebbe annotare il metodo con

@SuppressWarnings("unchecked") 

se siete convinti che sia corretta, ma non c'è modo di raggiungere a tempo di compilazione sicurezza.

+1

Nota, ho ancora ricevuto un avviso quando ho annotato il metodo in Java 1.7.Tuttavia, l'avviso è stato effettivamente soppresso quando ho annotato l'intera classe. – Cerin

2

Probabilmente il risultato di

return query.getResultList(); 

è List e non List<E>, in quanto si prevede (List<espressobar_milk>). [http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html] Ecco perché mostra l'avviso. In ogni caso, è possibile sopprimere questo avviso utilizzando:

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

incontrollato avvertimenti di conversione in genere il risultato di meccanismo di cancellazione del tipo di Java per i medicinali generici. L'idea è che il codice che usa i generici possa cooperare con il codice che non usa i generici (infatti, il codice generato omette il tipo generico).

Tuttavia, questo avvertimento viene visualizzato anche quando si tenta di applicare "generalità" a un elenco non generico (poiché questo è diverso da un cast basato su classe che genererebbe un ClassCastException). In questo caso, provare a virare sul tipo di latte a ciò che è un elenco non generico restituito da getResultList produce l'errore.

Leggi il Java Generics tutorial per ulteriori informazioni su questo.

3

Sembra che si stia utilizzando Hibernate, che attualmente sta implementando JPA 1.0 (si spera che Hibernate implementerà JPA 2.0 quando viene rilasciato. (Toplink è attualmente l'implementazione di riferimento di JPA 2.0)). Hibernate non utilizza alcuna funzionalità di java 1.5 e quindi non sono disponibili raccolte generiche.

1
@SuppressWarning ("unchecked") 

dovrebbe essere:

@SuppressWarnings("unchecked") 
10

Sto usando EJB 3.1 e ho avuto lo stesso problema. Ho trovato un'altra soluzione:

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

Questo risolve la conversazione incontrollato di avvertimento (non è necessario il @SuppressWarnings più annotazione).

Problemi correlati