Fórum Dúvida quanto a uma determinada anotação(@SuppressWarnings) #401317
19/05/2011
0
@SuppressWarnings("unchecked")
Pjava
Curtir tópico
+ 0Post mais votado
19/05/2011
No caso se exceções "unchecked", isso acontece devido a mistura de código que usa Generics com código que não usa Generics. Até o Java 5, não existia o mecanismo de Generics, isso significa que uma List podia receber qualquer coisa. Existe muito código legado desse naipe que precisa continuar compatível com as novas versões do Java.
O problema é que quando você mistura código sem o uso de genéricos com código que usa genéricos, o compilador não tem como detectar se a lista só contém objetos do tipo especificado. Veja o exemplo de um código problemático:
List abacate = new ArrayList(); abacate.add("Eu sou uma String"); List bola = abacate; int pato = bola.get(0);Veja que esse código compila tranqüilamente, porém irá disparar uma java.lang.ClassCastException em tempo de execução. É por isso que o compilador emite um Warning dizendo que essa é uma operação potencialmente perigosa.
Bom, aí é que está. Cabe ao programador garantir que a List abacate só contenha inteiros quando passa ela para a referência parametrizada bola. Se você sabe que abacate só contém inteiros, então esse cast é seguro. Você indica isso com a anotação @SuppressWarnings("unchecked").
Eu não vejo essa anotação como gambiarra, pelo contrário, não usando ela você receberá vários Warnings ao fazer casting do resultado de ferramentas como o Hibernate, Apache Commons Collections, etc, em código que não apresenta risco. A idéia do @SuppressWarnings("unchecked") é limpar as mensagens de compilação, de forma que outros programadores possam se preocupar apenas com warnings reais (minha experiência em projetos que não usavam @SuppressWarnings é que os programadores simplesmente começavam a ignorar todo tipo de Warning, deixando de detectar bugs cabeludos por causa disso).
Anthony Accioly
Gostei + 1
Mais Posts
19/05/2011
Anthony Accioly
A terceira linha na verdade é
List<Integer> bola = abacate;
Abraços,
Gostei + 1
19/05/2011
Davi Costa
Att Davi
Gostei + 0
19/05/2011
Anthony Accioly
Você quis dizer que o Warning serve para mostrar que pode acontecer um erro em tempo de execução, e a anotação server para indicar que você está ciente, correto?
Gostei + 0
20/05/2011
Davi Costa
As vezes na declaração do nosso método retornamos uma lista de um Objeto (vamos supor Usuario), mas criteria.list() retorna retorna um List e não um List<Usuario>, mais isso não gera erro de compilação. Mas nossas ide's tão inteligentes que são nos segere a colocarmos essa anotação @SuppressWarnings("unchecked"), como quem diz assim, olha cuidado pode ser que essa lista que vc está retornando não seja de Usuario não, pode acontecer algum erro em execução esteja ciente disso. Acontece muito também quando usamos métodos depreciados, ou usamos alguns conjuntos sem o auxílio de Generics, como Map ou List...
Espero ter sido mais claro agora.
Obrigado por elevar o nível da discussão
att Davi
Gostei + 0
20/05/2011
Anthony Accioly
Eu reparei que o Netbeans 7.0, na minha máquina, por algum motivo, veio com as sugestões relacionadas a warnings desativadas. Se o mesmo caso ocorrer para algum de vocês, siga os seguintes passos para ativá-las:
Clique em Tools no menu superiorEntre no submenu OptionsClique no botão Editor na parte superior da janelaClique na aba HintsSelecione Java no combo box LanguageNa árvore de configuração procure por Standard Javac warningsVocê pode tanto checar todas as warnings do Javac quanto somente algumas subcategorias (tipo Unchecked). Basta ticar o que você achar necessário.Clique em ok.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)