2009-04-25 22 views
9

estoy consiguiendo siguiente advertencia:advertencia: [sin control] conversión sin control

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

lo que pase la solución de problemas y probables. Estoy utilizando el código siguiente:

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

Gracias de antemano por cualquier sugerencia.

Respuesta

11

Bien, no tenemos detalles de lo que Query está aquí, pero presumiblemente su método getResultList devuelve un List crudo. Básicamente, el compilador no puede estar seguro de que la lista devuelta por getResultList solo contenga instancias de espressobar_milk (es un poco más sutil que eso, pero lo dejaremos allí por ahora).

Se podría tratar de hacerlo inflexible, probablemente por el cambio de la clase Query, o se puede anotar el método con

@SuppressWarnings("unchecked") 

si está convencido de que es correcta, pero no hay manera de lograr en tiempo de compilación la seguridad.

+1

Nota, todavía recibí una advertencia cuando anoté el método en Java 1.7.Sin embargo, la advertencia se suprimió cuando anoté toda la clase. – Cerin

2

probablemente el resultado de

return query.getResultList(); 

es List y no List<E>, ya que se espera (List<espressobar_milk>). [http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html] Esa es la razón por la que muestra la advertencia. En cualquier caso, puede suprimir esta advertencia usando:

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

advertencias de conversión no comprobadas normalmente son el resultado de mecanismo de tipo de borrado de Java para los genéricos. La idea es que el código que usa genéricos puede cooperar con código que no usa genéricos (de hecho, el código generado omite el tipo genérico).

Sin embargo, también aparece esta advertencia cuando intenta "adherir" la genérico a una lista no genérica (ya que esto es diferente de un elenco basado en la clase que lanzaría una ClassCastException). En este caso, tratar de pasar el tipo de leche a lo que es una lista no genérica devuelta por getResultList produce el error.

Lea el Java Generics tutorial para obtener más información al respecto.

3

Parece que está usando Hibernate, que actualmente está implementando JPA 1.0 (con suerte, Hibernate implementará JPA 2.0 cuando se lance. (Toplink es actualmente la implementación de referencia de JPA 2.0)). Hibernate no está utilizando ninguna característica de java 1.5 y, por lo tanto, no hay colecciones genéricas disponibles.

1
@SuppressWarning ("unchecked") 

debería ser:

@SuppressWarnings("unchecked") 
10

estoy usando EJB 3.1 y tuve el mismo problema. He encontrado otra solución:

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

Esto resuelve la conversación sin control de advertencia (no es necesario el @SuppressWarnings anotación más).

Cuestiones relacionadas