Pregunta

En algún momento cuando se mira a través de código, veo muchos métodos especifican una anotación:

@SuppressWarnings("unchecked")

¿Qué significa esto?

¿Fue útil?

Solución

A veces genéricos de Java simplemente no le permiten hacer lo que quiere, y hay que contar con eficacia al compilador que lo que está haciendo realmente ser legal en tiempo de ejecución.

Por lo general encontramos esto un dolor cuando me estoy burlando de una interfaz genérica, pero hay otros ejemplos también. Por lo general vale la pena tratar de encontrar una forma de evitar la advertencia en lugar de suprimir ella (la Java Generics FAQ ayuda aquí) pero a veces incluso si es sea posible, se dobla el código fuera de forma tanto que la supresión de la advertencia es más ordenado. Siempre añadir un comentario explicativo en ese caso!

Lo mismo genéricos FAQ tiene varias secciones sobre este tema, comenzando con "¿Cuál es una advertencia "sin control" " -?. vale la pena leer

Otros consejos

Es una anotación para suprimir compilar las advertencias sobre las operaciones sin marcar, los genéricos (no excepciones), tales como moldes. En esencia, implica que el programador no desea ser informado acerca de estos que ya está al tanto de la hora de compilar un poco de código en particular.

Puede leer más sobre este anotación específica aquí:

  

SuppressWarnings

Además, Oracle proporciona alguna documentación tutorial sobre el uso de anotaciones aquí:

  

Anotaciones

En sus propias palabras,

  

"La advertencia 'sin control' puede ocurrir cuando la interfaz con el código heredado por escrito antes de la llegada de los genéricos (discutido en la lección titulada Genéricos)."

También podría significar que la versión actual del sistema tipo Java no es lo suficientemente bueno para su caso. Había varios proposiciones JSR / hacks para solucionar este problema: Tipo de fichas, super Tipo Fichas , Class.cast ().

Si realmente necesita esta supresión, reducirla lo más posible (por ejemplo no lo ponga en la propia clase o en un método de largo). Un ejemplo:

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}

El SuppressWarning anotación se utilizado para suprimir las advertencias del compilador para el elemento anotada. Específicamente, la categoría unchecked permite la supresión de las advertencias del compilador generado como resultado de tipo sin marcar arroja.

Simplemente:. Es una advertencia por el cual el compilador indica que no se puede garantizar la seguridad de tipos

método de servicio JPA por ejemplo:

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
    Query query = entitymanager.createQuery("SELECT u FROM User u");
    return (List<User>)query.getResultList();
}

Si didn'n anotate los @SuppressWarnings ( "sin control") aquí, habría un problema con la línea, donde quiero volver a mi resultList.

En atajo de seguridad de tipos significa:. Un programa se considera de tipo seguro si se compila sin errores y advertencias y no plantea ningún inesperada ClassCastException s en tiempo de ejecución

http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals .html

En Java, los genéricos se implementan por medio del tipo de borrado. Por ejemplo, el código siguiente.

List<String> hello = List.of("a", "b");
String example = hello.get(0);

se compila a lo siguiente.

List hello = List.of("a", "b");
String example = (String) hello.get(0);

Y se define como List.of.

static <E> List<E> of(E e1, E e2);

¿Qué tipo de borrado después vuelve.

static List of(Object e1, Object e2);

El compilador no tiene idea de cuáles son los tipos genéricos en tiempo de ejecución, por lo que si usted escribe algo como esto.

Object list = List.of("a", "b");
List<Integer> actualList = (List<Integer>) list;

Java Virtual Machine no tiene idea de qué tipos genéricos son durante la ejecución de un programa, por lo que este puede compilar y ejecutar, como para la máquina virtual Java, este es un yeso para List tipo (esto es lo único que se puede verificar, por lo que verifica sólo eso).

Pero ahora añadir esta línea.

Integer hello = actualList.get(0);

Y JVM lanzará una ClassCastException inesperado, como compilador Java inserta una conversión implícita.

java.lang.ClassCastException: java.base/java.lang.String cannot be cast to java.base/java.lang.Integer

Una advertencia unchecked le dice a un programador que un yeso puede causar un programa para lanzar una excepción en otro lugar. La supresión de la advertencia con @SuppressWarnings("unchecked") le dice al compilador que el programador cree que el código sea seguro y no causará excepciones inesperadas.

¿Por qué querrías hacer eso? sistema de tipo Java no es lo suficientemente bueno para representar todos los posibles patrones de uso tipo. A veces se puede saber que un molde es seguro, pero Java no proporciona una manera de decirlo - para ocultar las advertencias de este tipo, @SupressWarnings("unchecked") se puede utilizar, por lo que un programador puede centrarse en las advertencias reales. Por ejemplo, Optional.empty() devuelve un producto único para evitar la asignación de opcionales vacíos que no almacenan un valor.

private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

Este reparto es seguro, ya que el valor almacenado en una opcional vacío no se puede recuperar lo que no hay riesgo de excepciones inesperados elenco clase.

Puede suprimir las advertencias del compilador y decirle a los genéricos que el código que se hubiera escrito es legal de acuerdo a la misma.

Ejemplo:

@SuppressWarnings("unchecked")
public List<ReservationMealPlan> retreiveMealPlan() {
     List<ReservationMealPlan> list=new ArrayList<ReservationMealPlan>();
    TestMenuService testMenuService=new TestMenuService(em, this.selectedInstance);
    list = testMenuService.getMeal(reservationMealPlan);
    return list;
 }

Un truco es crear una interfaz que se extiende una interfaz de base genérica ...

public interface LoadFutures extends Map<UUID, Future<LoadResult>> {}

A continuación, se puede comprobar con instanceof antes de la fundición ...

Object obj = context.getAttribute(FUTURES);
if (!(obj instanceof LoadFutures)) {
    String format = "Servlet context attribute \"%s\" is not of type "
            + "LoadFutures. Its type is %s.";
    String msg = String.format(format, FUTURES, obj.getClass());
    throw new RuntimeException(msg);
}
return (LoadFutures) obj;

En lo sé, por ahora tiene que ver con la supresión de advertencias sobre los genéricos; genéricos son una nueva construcción de programación no es compatible con las versiones de JDK anterior a JDK 5, por lo que cualquier mezcla de las antiguas construcciones con los nuevos podrían plantear algunos resultados inesperados.

El compilador advierte al programador de ello, pero si el programador ya sabe, que puede convertir esas advertencias temidas va a basar SuppressWarnings.

Una advertencia por el cual el compilador indica que no se puede garantizar la seguridad de tipos. El término de advertencia "sin control" es engañosa. Esto no quiere decir que la advertencia no está marcada de forma alguna. El término "sin control" se refiere al hecho de que el compilador y el sistema de ejecución no tienen suficiente información de tipo de realizar todas las revisiones de tipos que serían necesarias para garantizar la seguridad de tipos. En este sentido, algunas operaciones son "sin control".

La fuente más común de advertencias "sin marcar" es el uso de tipos de primas. advertencias "sin marcar" se emiten cuando se accede a un objeto a través de una variable de tipo prima, porque el tipo de prima no proporciona suficiente información de tipo para llevar a cabo todas las comprobaciones de tipo necesarios.

Ejemplo (de advertencia sin control en conjunción con los tipos de primas):

TreeSet set = new TreeSet(); 
set.add("abc");        // unchecked warning 
set.remove("abc");
warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.TreeSet 
               set.add("abc");  
                      ^

Cuando el método add se invoca el compilador no sabe si es seguro para agregar un objeto String a la colección. Si el TreeSet es una colección que contiene cadena s (o un supertipo del mismo), entonces sería seguro. Pero a partir de la información del tipo proporcionado por el tipo de prima TreeSet el compilador no puede contar. De ahí que la llamada es potencialmente inseguro y se emite una advertencia "sin control".

advertencias "sin marcar" también se reportan cuando el compilador encuentra un molde cuyo tipo de destino es o bien un tipo parametrizado o un parámetro de tipo.

Ejemplo (de una advertencia sin control en conjunción con un molde a un tipo parametrizado o escriba variable):

  class Wrapper<T> { 
  private T wrapped ; 
  public Wrapper (T arg) {wrapped = arg;} 
  ... 
  public Wrapper <T> clone() { 
    Wrapper<T> clon = null; 
     try {  
       clon = (Wrapper<T>) super.clone(); // unchecked warning 
     } catch (CloneNotSupportedException e) {  
       throw new InternalError();  
     } 
     try {  
       Class<?> clzz = this.wrapped.getClass(); 
       Method   meth = clzz.getMethod("clone", new Class[0]); 
       Object   dupl = meth.invoke(this.wrapped, new Object[0]); 
       clon.wrapped = (T) dupl; // unchecked warning 
     } catch (Exception e) {} 
     return clon; 
  } 
} 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: Wrapper <T> 
                  clon = ( Wrapper <T>)super.clone();  
                                                ^ 
warning: [unchecked] unchecked cast 
found   : java.lang.Object 
required: T 
                  clon. wrapped = (T)dupl;

Un molde cuyo tipo de destino es o bien un (wildcard hormigón o acotada) tipo parametrizado o un parámetro de tipo es insegura, si un cheque tipo dinámico en tiempo de ejecución está involucrado. En tiempo de ejecución, sólo el tipo de borrado está disponible no del tipo estático, exacta que es visible en el código fuente. Como resultado, la parte de tiempo de ejecución de la fundición se realiza en base al tipo de borrado, no en el tipo estático exacta.

En el ejemplo, el molde a Wrapper sería comprobar si el objeto de regresar de super.clone es una envoltura, no si es una envoltura con un tipo particular de miembros. Del mismo modo, los cilindros que el parámetro de tipo T se convierten a tipo de objeto en tiempo de ejecución, y probablemente optimizan distancia por completo. Debido al tipo de borrado, el sistema de tiempo de ejecución no es capaz de realizar comprobaciones de tipo más útiles en tiempo de ejecución.

En cierto modo, el código fuente es engañosa, ya que sugiere que un yeso para el respectivo tipo de destino se lleva a cabo, mientras que, de hecho, la parte dinámica del reparto sólo comprueba contra el borrado tipo de tipo de destino. La advertencia "sin control" se emite para llamar la atención del programador para este desajuste entre el aspecto estático y dinámico del elenco.

Por favor, consulte: ¿Qué es una advertencia "sin control"?

@SuppressWarnings anotación es una de las tres anotaciones incorporadas disponibles en JDK y añadido junto @ Override y @Deprecated en Java 1.5.

@SuppressWarnings instruyen al compilador para ignorar o suprimir, advertencia del compilador especifica en el elemento anotado y todos los elementos del programa dentro de ese elemento. Por ejemplo, si una clase está anotado para suprimir una advertencia en particular, entonces una advertencia generado en un método dentro de esa clase también será separado.

@SuppressWarnings

Es posible que haya visto ( "sin control") y @SuppressWarnings ( "en serie"), dos de los ejemplos más populares de @SuppressWarnings anotación. Primero se utiliza para suprimir la alerta generada debido a la fundición sin control, mientras que la advertencia más tarde se utiliza para recordar acerca de la adición serialVersionUID en una clase Serializable.

Leer más: https://javarevisited.blogspot.com/2015/09/what-is-suppresswarnings-annotation-in-java-unchecked-raw-serial.html#ixzz5rqQaOLUa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top