ti-enxame.com

Java 6: aviso @SuppressWarnings ("rawtypes") não suportado

Eu mudei para uma nova máquina que possui o mais recente compilador Java da Sun) e notei alguns avisos no código Java 6 existente.) O IDE Eclipse sugeriu que eu anotasse a tarefa com:

@SuppressWarnings("rawtypes")

Por exemplo:

class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();

Quando voltei à máquina com o compilador mais antigo (JDK 1.6.0_20), notei que esse compilador mais antigo agora adverte sobre a supressão de avisos de "tipos brutos", alegando que essa supressão não é suportada e propondo substituí-lo por @SuppressWarnings ("desmarcado"). Além disso, houve alguns lugares em que o compilador mais recente, por padrão, me levou a colocar "desmarcado" e "rawtypes" - compilar esse código com o compilador antigo reproduz o mesmo aviso.

Como posso impor compatibilidade com versões anteriores/anteriores entre os dois, para que nenhum compilador produza avisos?

41
eold

Você pode usar a @SuppressWarnings("unchecked") que é suportada pelo compilador Eclipse e pelo javac.

Mas lembre-se de que a anotação @SuppressWarnings É usada pelo seu compilador, que pode ter seus próprios valores. O JLS força apenas o compilador a entender os valores "desmarcado" e "descontinuado" (por enquanto).

Os fornecedores do compilador devem documentar os nomes de aviso que eles suportam em conjunto com esse tipo de anotação. Eles são incentivados a cooperar para garantir que os mesmos nomes funcionem em vários compiladores.

Se você usa o Helios, precisará definir uma opção específica para permitir @SuppressWarnings("unchecked") em vez de @SuppressWarnings("rawtypes"),

Caso não seja possível atualizar o código com o novo token, a propriedade do sistema suppressRawWhenUnchecked=true Pode ser configurada ao iniciar o Eclipse.


Recursos:


EDIT: Aqui está o artigo knol agora indisponível, que foi usado como referência, originalmente escrito por Alex Miller .

Anotação @SuppressWarnings em Java

Anotação padrão para suprimir vários avisos

A anotação SuppressWarnings foi adicionada como uma anotação padrão em Java SE 5.

Definição

A anotação @ SuppressWarnings é definida na seção Java Language Specification 9.6.1.5 . seção afirma:

O tipo de anotação SuppressWarnings suporta o controle do programador sobre avisos emitidos pelo compilador Java. Ele contém um único elemento que é uma matriz de String. Se um programa declaração é anotada com a anotação @SuppressWarnings(value = {S1, ... , Sk}), então um compilador Java não deve relatar nenhum aviso identificado por um dos S1, ..., Sk, se esse aviso tivesse sido gerado como resultado da declaração anotada ou de qualquer uma de suas partes.

Os avisos não marcados são identificados pela sequência "unchecked".

A seção subsequente em @Deprecation Também menciona que esses avisos podem ser suprimidos com @SuppressWarnings("deprecation").

Tipos de aviso válidos

As únicas duas seqüências de aviso mencionadas na própria especificação são "desmarcadas" e "descontinuadas". No entanto, o Sun JDK usa um conjunto maior de cadeias de caracteres no compilador. Você pode determinar o conjunto atual executando:

javac -X

que mostrará (entre outras coisas) as configurações válidas para -Xlint.

Por exemplo, o Sun JDK 1.5 mostra:

  • all - suprime todos os avisos desse código
  • descontinuação - suprimir avisos de usar código descontinuado
  • desmarcada - suprime avisos de uma chamada não verificada ou de uma transmissão não verificada
  • fallthrough - suprime avisos se um switch passar sem encontrar um caso válido (e sem padrão)
  • caminho -
  • serial - suprime avisos se uma classe Serializable não definir um serialVersionUID
  • finalmente - suprimir avisos de retorno dentro de um final (que ignorará o retorno com a tentativa)

E o Sun JDK 1.6 adiciona:

  • fundida
  • divzero - suprime avisos se for detectado um número inteiro dividido por zero
  • esvaziar
  • substituições
  • none

IDEs e ferramentas de análise estática geralmente oferecem suporte a um grande número de outros valores possíveis para @SuppressWarnings. Esses valores correspondem a verificações específicas de análise estática executadas pelo IDE.

Eclipse

Os valores de aviso do Eclipse para o Eclipse 3.3 estão documentados nos documentos JDT .

  • tudo - suprime todos os avisos
  • boxing - suprime avisos relativos a operações de boxe/unboxing
  • cast - suprime avisos relativos a operações de cast
  • dep-ann - suprime avisos relativos à anotação obsoleta
  • descontinuação - suprimir avisos relativos à descontinuação
  • fallthrough - suprime avisos relativos a quebras ausentes nas instruções do switch
  • finalmente - suprimir avisos relativos ao bloco finalmente que não retornam
  • ocultando - suprime avisos relativos a habitantes locais que ocultam variáveis
  • switch incompleto - suprime avisos relativos a entradas ausentes em uma instrução switch (caso de enum)
  • nls - suprime avisos relativos a literais de string não nls
  • null - suprime avisos relativos à análise nula
  • restrição - suprimir avisos relativos ao uso de referências desanimadas ou proibidas
  • serial - suprime avisos relativos ao campo serialVersionUID ausente para uma classe serializável
  • static-access - suprime avisos relativos a acesso estático incorreto
  • acesso sintético - suprimir avisos relativos ao acesso não otimizado de classes internas
  • desmarcado - suprime avisos relativos a operações não verificadas
  • acesso não qualificado ao campo - suprime os avisos relativos ao acesso não qualificado ao campo
  • unused - suprime avisos relativos ao código não utilizado

IntelliJ

NetBeans

Exemplos

Um exemplo de especificação de um único aviso:

@SuppressWarnings("unchecked")
public void methodWithScaryWarnings() {
    List rawList = new ArrayList();
    List<String> stringList = (List<String>)rawList;
}

Um exemplo do uso de dois avisos:

@SuppressWarnings({"unchecked","deprecation"})
public void methodWithScaryWarnings() {
    callDeprecatedMethod();
}
43
Colin Hebert

Observe que o Eclipse 3.5 não entende os tipos brutos e sinaliza um aviso para mudar para desmarcado. É frustrante que o Eclipse tenha apresentado anotações de tipos não processados, o que causa mais problemas do que resolver. Eles deveriam ter ficado com o padrão.

4
inder