Warning com ObjectInputStream e Java 5

4 respostas
S

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

List<String> listaArq = new ArrayList<String>();

try{
	FileInputStream fis = new FileInputStream("first.init");
	ObjectInputStream ois = new ObjectInputStream(fis);
	
	// Read object.
	listaArq = (ArrayList<String>) ois.readObject();
.....

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:

4 Respostas

T

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…

S

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).

List listaArq = new ArrayList();
 
 try{
 	FileInputStream fis = new FileInputStream("first.init");
 	ObjectInputStream ois = new ObjectInputStream(fis);
 	
 	// Read object.
 	listaArq = (ArrayList) ois.readObject();
 .....

Obrigado pela informação,

:thumbup:

T

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.

S

thingol,

na verdade fiz apenas como teste.

:wink:

Criado 18 de agosto de 2005
Ultima resposta 18 de ago. de 2005
Respostas 4
Participantes 2