Duvida com interfaces

6 respostas
Mikhas

Hey galera

Hoje estava trabalhando no meu projetenho aqui no trampo e me ocorreu algo que nunca vi e muito menos entendi.

Criei uma interface public interface JSONable com um metodo public String toJson();

Então criei uma classe que a implementa public class Definition implements JSONable;

Em um dos meus servicós criei o seguinte metodo: public String toJson(List records);.

Quando fui usar o metodo o Eclipse me mandou a seguinte mensagem;
[color=red]The method toJson(List ) in the type TaskService is not applicable for the arguments (List )[/color]

Ai eu fiquei sem entender nada :frowning:

Se a minha classe Definition implementa JSONable, ela “é um” JSONable correto? Por que o metodo não a aceita?

Para corrigir, mudei a assinatura do metodo para: public String toJson(List<? [color=brown]extends[/color] JSONable> records);

Seguindo a mesma logica, e forçando um pouquinho, então todos os metodos deveriam ter algo como:
nomeDoMetodo(List<? extends Object> arg)???

Fiquei sem entender nada :frowning:
Alguem explica ahe please

6 Respostas

B

Com List você está dizendo que a lista terá objetos do tipo JSONable. Isso não é 100% correto, já que essa lista só pode ter objetos que implementam JSONable (pois uma interface não pode ser instanciada), ou seja objetos ? extends JSONable.

TiD

Perai, vamos com calma…

Está um pouco confuso. Na sua interface voce definiu o metodo toJson sem argumentos, e implementou-o na sua classe Definition da mesma forma, correto ? Sem argumentos. Até aí tudo bem.

Então, em outra classe, voce implementou um metodo toJson com argumentos (List<JSONable> records), ok ?

Essa sua classe implementa alguma interface ou extende alguma classe ? Porque em teoria deveria funcionar… se voce faz referencia a uma interface, essa referencia é polimorfica pois pode referenciar qualquer classe que a implemente.

Clarifique mais um pouco, por favor.

Abraço

Mikhas

TiD:
Perai, vamos com calma…

Está um pouco confuso. Na sua interface voce definiu o metodo toJson sem argumentos, e implementou-o na sua classe Definition da mesma forma, correto ? Sem argumentos. Até aí tudo bem.

Então, em outra classe, voce implementou um metodo toJson com argumentos (List<JSONable> records), ok ?

Essa sua classe implementa alguma interface ou extende alguma classe ? Porque em teoria deveria funcionar… se voce faz referencia a uma interface, essa referencia é polimorfica pois pode referenciar qualquer classe que a implemente.

Clarifique mais um pouco, por favor.

Abraço

O Meu serviço não implementa ou extende nenhuma classe. Esse metoto toJson(List<JSONable> recods) dela serve apenas para criar um grande JSON de uma coleção:

public String toJson(List<JSONable> records) {
		StringBuilder builder = new StringBuilder();
		builder.append('[');

		for (JSONable record : records) {
			builder.append(record.toJson()).append(',');
		}

		builder.deleteCharAt(builder.length() - 1);
		builder.append(']');

		return builder.toString();
	}
TiD

Cara, muito estranho… em tese, deveria funcionar normalmente.

O Eclipse as vezes da uns erros malucos e ao reiniciar ele para… tenta compilar diretamente com o javac e ve se ele da o mesmo erro.

Mikhas

Vou deixar como esta. É um projeto web beeem grande para mim recompilar na mão.

Não vale a pena o esforço.

Só queria saber oque aconteceu aqui.

TiD

Nao precisa recompilar tudo, basta setar o classpath e recompilar apenas essa classe.

Talvez não tenha ficado muito claro, mas se o seu metodo faz referencia a uma interface nos argumentos e voce esta passando um objeto que implementa essa interface e ele está reclamando, com certeza algo de errado há.

Criado 23 de julho de 2009
Ultima resposta 23 de jul. de 2009
Respostas 6
Participantes 3