Dúvida Annotation @Override

6 respostas
rodrigoacb

"Deployando" os fontes de uma edição da Revista Java Magazine, deparei com um mesmo problema para diversas classes DAO.
No fonte/exemplo abaixo, aparece erro na linha 11 com a mensagem: "[color=red]The method criar(Cliente) of type ClienteJpaDao must override a superclass method[/color]"

package jm.livrosonline.dao;

import javax.persistence.EntityManager;

import jm.livrosonline.entidade.Cliente;
import jm.livrosonline.factory.FactoryDao;

public class ClienteJpaDao implements ClienteDao {

	@Override
	public void criar(Cliente cliente) {
		EntityManager em = FactoryDao.createEntityManager();
		em.getTransaction().begin();
		em.persist(cliente);
		em.getTransaction().commit();
	}

}
Ora, o que não entendo é por que a "solução" é retirar a annotation @Override e pronto! O código compila... Por que? Devo estar pisando na bola sobre algum conceito de annotation e/ou linguagem java mesmo... Alguém pode ajudar? Obrigado! Abrs

6 Respostas

Carlos_ds_jar
rodrigoacb:
"Deployando" os fontes de uma edição da Revista Java Magazine, deparei com um mesmo problema para diversas classes DAO. No fonte/exemplo abaixo, aparece erro na linha 11 com a mensagem: "[color=red]The method criar(Cliente) of type ClienteJpaDao must override a superclass method[/color]"
package jm.livrosonline.dao;

import javax.persistence.EntityManager;

import jm.livrosonline.entidade.Cliente;
import jm.livrosonline.factory.FactoryDao;

public class ClienteJpaDao implements ClienteDao {

	@Override
	public void criar(Cliente cliente) {
		EntityManager em = FactoryDao.createEntityManager();
		em.getTransaction().begin();
		em.persist(cliente);
		em.getTransaction().commit();
	}

}
Ora, o que não entendo é por que a "solução" é retirar a annotation @Override e pronto! O código compila... Por que? Devo estar pisando na bola sobre algum conceito de annotation e/ou linguagem java mesmo... Alguém pode ajudar? Obrigado! Abrs


Por favor coloque o codigo da superclasse para que possamos analisar... 8)

claudiom

a annotation @override indica que você está fazendo override de um método da superclasse…

no seu caso, a interface ClienteDao não deve ter o método criar(Cliente)… e portanto não consegue compilar…

quando tira a anotação, ele vira um método da sua própria classe, e por isso compila normal…

uma das principais utilidades dessa anotação é justamente ser avisado se houver mudança na classe pai…
se um método muda, você pára de fazer override, seu código não compila e você fica sabendo o que tá acontecendo…

rodrigoacb
package jm.livrosonline.dao;

import jm.livrosonline.entidade.Cliente;

public interface ClienteDao {

	void criar(Cliente cliente);

}
rodrigoacb

claudiom:
a annotation @override indica que você está fazendo override de um método da superclasse…

no seu caso, a interface ClienteDao não deve ter o método criar(Cliente)… e portanto não consegue compilar…

quando tira a anotação, ele vira um método da sua própria classe, e por isso compila normal…

uma das principais utilidades dessa anotação é justamente ser avisado se houver mudança na classe pai…
se um método muda, você pára de fazer override, seu código não compila e você fica sabendo o que tá acontecendo…


Ok. Obrigado! Valeu.
Mas, criar(Cliente cliente) está em ClienteDao, conforme código acima…
Ambas as classes, ClienteDao e ClienteJpaDao, estão no mesmo pacote.
Estranho demais… rs saco… hehehe

Será que é porque ClienteDao é uma interface?

Carlos_ds_jar

Ok. Obrigado! Valeu.
Mas, criar(Cliente cliente) está em ClienteDao, conforme código acima…
Ambas as classes, ClienteDao e ClienteJpaDao, estão no mesmo pacote.
Estranho demais… rs saco… hehehe

Não são ambas as classes são a classe ClienteJpaDao e a interface Cliente Dão :slight_smile:

Com toda certeza é isso. A interface é um contrato que diz quais metodos uma classe deve possuir, quando vc coloca o implemens na sua classe vc está assinando esse contrado de maneira que vc vai ‘fornecer’ uma implementação ao metodo estabelecido pelo contrato e não ‘sobrescrever’ um método ja escrito numa superclasse. Portanto na ocasião não cabe colocar um @Override.

L

Se você compilar usando JDK 5, é erro de compilação dar @Override sobre um método de interface (é permitido apenas para superclasses). Usando JDK 6, tanto métodos de interfaces quanto de superclasses podem ser sobrescritos e marcados com @Overwrite.

O que deve estar acontecendo é que o autor da revista usou a versão 6 e você, a versão 5.

Criado 2 de agosto de 2010
Ultima resposta 3 de ago. de 2010
Respostas 6
Participantes 4