O que faz com que o javac emita o aviso “usa operações não verificadas ou inseguras”

Por exemplo:

javac Foo.java Note: Foo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 

Isso aparece no Java 5 e posterior, se você estiver usando collections sem especificadores de tipos (por exemplo, Arraylist() vez de ArrayList() ). Isso significa que o compilador não pode verificar se você está usando a coleção de maneira segura, usando genéricos .

Para se livrar do aviso, seja específico sobre o tipo de objects que você está armazenando na coleção. Então, ao invés de

 List myList = new ArrayList(); 

usar

 List myList = new ArrayList(); 

No Java 7, você pode reduzir a instanciação genérica usando a Inferência de tipo .

 List myList = new ArrayList<>(); 

Se você fizer o que ele sugere e recompilar com a opção “-Xlint: unchecked”, ele fornecerá informações mais detalhadas.

Além do uso de tipos brutos (conforme descrito pelas outras respostas), um lançamento não verificado também pode causar o aviso.

Depois de compilado com -Xlint, você poderá refazer seu código para evitar o aviso. Isso nem sempre é possível, especialmente se você estiver integrando com código legado que não pode ser alterado. Nessa situação, você pode decidir suprimir o aviso em locais onde você sabe que o código está correto:

 @SuppressWarnings("unchecked") public void myMethod() { //... } 

Esse aviso significa que seu código opera em um tipo bruto, recompile o exemplo com o

 -Xlint:unchecked 

para obter os detalhes

como isso:

 javac YourFile.java -Xlint:unchecked Main.java:7: warning: [unchecked] unchecked cast clone.mylist = (ArrayList)this.mylist.clone(); ^ required: ArrayList found: Object 1 warning 

docs.oracle.com fala sobre isso aqui: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

por exemplo, quando você chama uma function que retorna Coleções genéricas e não especifica os parâmetros genéricos.

para uma function

 List getNames() List names = obj.getNames(); 

irá gerar este erro.

Para resolvê-lo, basta adicionar os parâmetros

 List names = obj.getNames(); 

O aviso “operações não verificadas ou inseguras” foi adicionado quando o java adicionou Generics , se bem me lembro. Geralmente está pedindo para você ser mais explícito sobre os tipos, de uma forma ou de outra.

Por exemplo. o código ArrayList foo = new ArrayList(); triggers esse aviso porque o javac está procurando por ArrayList foo = new ArrayList();

Eu só quero adicionar um exemplo do tipo de aviso não verificado que vejo com bastante frequência. Se você usar classs que implementam uma interface como Serializable, muitas vezes você chamará methods que retornam objects da interface e não a class real. Se a class que está sendo devolvida precisar ser convertida em um tipo baseado em genéricos, você poderá obter esse aviso.

Aqui está um breve (e um tanto bobo) exemplo para demonstrar:

 import java.io.Serializable; public class SimpleGenericClass implements Serializable { public Serializable getInstance() { return this; } // @SuppressWarnings("unchecked") public static void main() { SimpleGenericClass original = new SimpleGenericClass(); // java: unchecked cast // required: SimpleGenericClass // found: java.io.Serializable SimpleGenericClass returned = (SimpleGenericClass) original.getInstance(); } } 

getInstance () retorna um object que implementa Serializable. Isso deve ser convertido para o tipo real, mas isso é uma conversão não verificada.

A solução seria usar um tipo específico em <> como ArrayList .

exemplo:

 File curfolder = new File( "C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList filename = Arrays.asList(file); 

código acima gera aviso porque ArrayList não é do tipo específico.

 File curfolder = new File( "C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList filename = Arrays.asList(file); 

código acima vai fazer bem. Apenas a mudança está na terceira linha após ArrayList .