Warning com ObjectInputStream e Java 5

Pessoal,
estou tentando compilar um código que possui o trecho abaixo:

[code]List listaArq = new ArrayList();

try{
FileInputStream fis = new FileInputStream(“first.init”);
ObjectInputStream ois = new ObjectInputStream(fis);

// Read object.
listaArq = (ArrayList<String>) ois.readObject();

…[/code]

Ele me dá um warning:

warning: [unchecked] unchecked cast found : java.lang.Object required: java.util.ArrayList<java.lang.String> listaArq = (ArrayList<String>) ois.readObject();

Estou curioso sobre o porquê desse warning ?
Como fazer esse cast corretamente.

Valeu pessoal :thumbup:

Bom, quando você usa ObjectInputStream, pode estar vindo qualquer coisa do ObjectInputStream (até um ArrayList<Integer>). Por isso é que o compilador reclama, porque você aí está abrindo um buraco nas condições de segurança do generics. É que se vir um ArrayList<Integer>, não dá ClassCastException NESSE ponto, mas mais tarde (o que é muito chato :mrgreen: , quando você for usar os elementos do ArrayList. )

O cast nesse caso vai sempre dar warning porque você está forçando um pino quadrado num buraco redondo (pode ser que o pino seja menor que o buraco e tudo dê certo :wink: )

Há duas formas de resolver isso:

a) Se você estivesse usando o Java 6, ou se não me engano o compilador do Eclipse 3.1, você pode usar a “annotation” @SuppressWarnings (“unchecked”) no seu método (infelizmente no compilador do Java 5.0 da Sun o @SuppressWarnings não suprime ainda os warnings. Que pena…)

b) Deixar como está - como eu disse, você se compromete a fazer com que o pino seja menor que o buraco…

thingol,

com base no que você disse resolvi fazer um teste. mudei o código para o que está abaixo para ver se o warning sumia, e ele sumiu (como era previsto pelo que vc tinha escrito).

[code]List listaArq = new ArrayList();

try{
FileInputStream fis = new FileInputStream(“first.init”);
ObjectInputStream ois = new ObjectInputStream(fis);

// Read object.
listaArq = (ArrayList) ois.readObject();

…[/code]

Obrigado pela informação,

:thumbup:

Eu recomendaria deixar o seu programa com warnings mesmo, porque é melhor (em 99% do tempo) usar o ArrayList < String > em vez de usar o ArrayList normal.
Não fique tirando o warning porque lhe incomoda - é o “Zen” da programação: você pode até usar “goto”, mas só se você souber o que está fazendo.

thingol,

na verdade fiz apenas como teste.

:wink: