Erro de coerção

2 respostas
A
public static CategoriaFilme [] listar() throws SQLException{
		LinkedList< CategoriaFilme > lista = new LinkedList< CategoriaFilme >();
		String query = new String("Select id_categoria, descricao from CategoriaFilmes ");
		Statement st = BancoDados.getConn().createStatement();
		ResultSet rs = st.executeQuery(query);
		
		while(rs.next()){
			long id_categoria = Long.parseLong( rs.getString(1) );
			String descricao  = rs.getString(2);
			
			lista.add( new CategoriaFilme(id_categoria, descricao) );
		}
		
		return (CategoriaFilme[] ) lista.toArray();
	}
tenho este método e ocorre um erro na linha em negrito, ao tentar fazer a coerção de Object[] para CategoriaFilme[] ele lança um ClassCastException.

O que há de errado na Coerção??

detalhe esta classe é chamada apartir de um JSP.

Grato a todos

[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Cassolato[/color][/size] :joia:

2 Respostas

C

Olá AAguiar,

É o seguinte: o método toArray() retorna um objeto do tipo Object[] sempre, e você não pode converter pra E[] (considere E como o tipo do array, como CategoriaFilme), porque o objeto é um Object[] mesmo. Porém, os elementos desse array são do tipo E, apesar de a referência ser do tipo Object. Ou seja, se você fizer:

Object[] array = lista.toArray(); CategoriaFilme[] categorias = (CategoriaFilme[]) array;

Vai dar um ClassCastException. Mas se você fizer:

... CategoriaFilme c = (CategoriaFilme) array[0];

Você pega o objeto e converte para o seu tipo. O que você não pode converter é o array em si.

Maaaaas, existe uma variação do método toArray() que recebe um array de um certo tipo, e esse método coloca os elementos nesse array, ao invés de criar um novo, como o toArray() faz (mais embaixo eu vou dizer uma exceção a essa regra).

Veja o exemplo:

CategoriaFilme[] categorias = new CategoriaFilme[lista.size]; lista.toArray(categorias);

O objeto categorias agora é o que você queria. Mas observe que se o array que você passa como parâmetro for de tamanho menor do que o tamanho necessário, é criado um novo array (essa é a exceção que eu comentei aí em cima, que mesmo você passando um array, ele cria outro, porque não cabe), mas esse array já é do tipo que você passa, e não um Object[]. Como esse método sempre retorna o array alocado com os objetos da lista, você pode pegar o retorno dele, quando for criado um novo array:

CategoriaFilme[] categorias = new CategoriaFilme[0]; categorias = lista.toArray(categoria);

Nesse caso, passar um array de tamanho 0 só serve pra o método conhecer o tipo do array que eu quero de retorno, porque como não cabe o resultado nele, o método cria um array novo e me retorna.

Até mais, :wink:

A

ow valew mesmo kra, pela ajuda e pela explicação…

Grato a todos.

Criado 18 de outubro de 2006
Ultima resposta 18 de out. de 2006
Respostas 2
Participantes 2