[RESOLVIDO] Exceção de cast em classe

5 respostas
Onimatsu

Boa tarde.

Estou construindo um método que recebe uma lista de elementos de dois objetos distintos. O problema é que quando pego um elemento da lista e aplico instanceof o resultado é false, apesar da classe usar generics.

Preciso fazer alguma modificação na classe Elemento ou tenho que pegar cada objeto da lista separadamente para aplicar o cast? O que fazer?
public <T> void escreveDados(List<T> lista) {
	if (lista.get(0) instanceof Elemento) {
		for (Elemento elemento : (List<Elemento>) lista) {
			// ações
		}
	} // else if outra classe ...
}

public class Elemento<T> {
	// atributos e métodos
}

5 Respostas

igor_ks

Use polimorfismo para isso
Deixe seu método escreveDados abstrato, em uma classe abstrata, aí em cada classe que vc iria fazer o “if instanceof”, vc extends dessa classe sua abstrata, ficando cada classe filha, responsável por implementar ela

Onimatsu

Entendi sua dica só que o método escreveDados fica numa classe a parte, não posso reimplementar esse método na classe do 1 Elemento e do 2 Elemento, não ficaria bem estruturado no meu projeto.
Logo, tenho mesmo que fazer com que escreveDados aceite uma lista de objetos diferentes.

igor_ks

Sim, entendo que o escreveDados fica em outra classe, e que há outras classes tipo essa “Elemento”

O que quero dizer é mais ou menos isso:

public abstract class AbstractClass {
	
	protected abstract void saveOnDatabase(String value);
	
	protected abstract File getFile();
	
	public void readFileAndSaveOnDatabase() {
		File file = getFile();
		saveOnDatabase(file.getName());
	}

}
public class Class1 extends AbstractClass{

	private String text1;
	
	private String text2;
	
	@Override
	public void saveOnDatabase(String value) {
		//Codigo para salvar na base
	}
	
	@Override
	protected File getFile() {
		//codigo para ler o arquivo referente a Class1
		return null;
	}
   
//getters and setters

}
public class Class2 extends AbstractClass{
	
	private String field1;
	
	private String field2;

	@Override
	public void saveOnDatabase(String value) {
		//Codigo para salvar na base
	}
	
	@Override
	protected File getFile() {
		//codigo para ler o arquivo referente a Class1
		return null;
	}
//getters and setters
public class App {
	
	public static void main(String[] args) {
		AbstractClass class1 = new Class1();
		class1.readFileAndSaveOnDatabase();

                AbstractClass class2 = new Class2();
		class2.readFileAndSaveOnDatabase();
	}

}

Onde quero representar o Class1 como fosse sua classe Elemento, e o método saveOnDatabase, por exemplo, como se fosse seu método escreveDados

igor_ks

Fiz isso rapidamente para tentar demonstrar minha idéia. Se quiser entender melhor, coloca uns System.out.println nos métodos para entender o comportamento

Onimatsu
Sua lógica é perfeitamente aplicável, porém cada caso é um caso. Consegui resolver o problema removendo o generics da classe e da lista, retirei o objeto da lista de objetos para realizar o cast e substitui a lista antiga por outra capaz de aceitar qualquer tipo de objeto <?>
public void escreveDados(List&lt;?&gt; lista) {
	if (lista.get(0) instanceof Elemento) {
		for (Object objeto : lista) {
            Elemento elemento = (Elemento) objeto;
			// ações
		}
	}
}

public class Elemento {
	// atributos e métodos
}
Agradeço pelo seu tempo e atenção, utilizarei seus conceitos em uma próxima oportunidade. Muito obrigado.
Criado 6 de março de 2015
Ultima resposta 7 de mar. de 2015
Respostas 5
Participantes 2