2012-01-26 18 views
5
final Criteria crit = session.createCriteria(MyClass.class); 
final List<MyClass> myClassList = crit.list(); 

risultati in questo: sicurezza Tipo: L'espressione di tipo List esigenze di conversione incontrollato di conformarsi alla ListaEvita con Hibernate query di criteri

È loro un metodo per rimuovere l'avviso, come ottengo un errore utilizzando questo:

final List<MyClass> myClassList = Collections.checkedList(MyClass.class, crit.list()); 

risposta

6

Beh, è ​​possibile utilizzare:

@SuppressWarnings("unchecked") 

prima della dichiarazione ...

Si noti che questo sopprimerà solo l'avviso - non farà nulla per rendere il codice più sicuro. In questo caso, personalmente sarei abbastanza contento di questo; Mi piacerebbe che Hibernate faccia la cosa giusta.

+0

@EvertonAgner: stavo andando a "rimuovere il messaggio di avvertimento" della domanda. –

+0

Sì, sì, lo so ... volevo dire che dovremmo sapere se vuole risolvere il problema o se ha appena un OCD sugli avvertimenti ........ Come faccio * lol – everton

+2

Se si dipende da un API di terze parti che restituisce raccolte non tipizzate, non c'è molto che tu possa utilmente fare se non sopprimere l'avviso. E aggiungi un commento che spieghi perché puoi garantire che gli elementi della collezione siano davvero del tipo giusto. –

4

Nel codice

final List<MyClass> myClassList 
    = Collections.checkedList(MyClass.class, crit.list()); 

si solo bisogno di invertire l'ordine degli argomenti da checkedList().

Btw è possibile importare il metodo statico per rendere il codice più conciso. Inoltre, non sapevo di checkedList() - grazie per l'heads-up!

Edit: checkedList() non fa quello che si vuole - come ho dovuto capire se avessi pensato correttamente prima di rispondere.

checkedList() controllerà i tipi di qualsiasi elemento aggiunto all'elenco e non verrà eseguito immediatamente. Al contrario di una lista normale che ti permetterebbe di inserire i tipi sbagliati e fallire solo al momento del recupero. Nel tuo caso non fa differenza poiché non inserirai tu stesso gli elementi (suppongo).

La risposta di Jon Skeet (@SuppressWarnings("unchecked")) è quella giusta.

+0

Ricevo ancora l'avviso ... dopo aver invertito i paramters – NimChimpsky

+0

Scusate, non l'ho guardato con cura. Andando a modificare la mia risposta con informazioni migliori. –

1

Per me, il modo migliore per evitare avviso di sicurezza tipo è come Matt Quail dice in questo post: How to avoid type safety warnings with Hibernate HQL results?, scrivendo un cast-helper, ma con criteri invece di query, come questo:

@SuppressWarnings("unchecked") 
public static <T> List<T> listAndCast(Criteria crit) { 
    List<T> list = crit.list(); 
    return list; 
} 

E solo devi chiamare questo metodo:

List<MyClass> myClassList = listAndCast(crit); 

Saluti!

Problemi correlati