Conflito entre assinaturas de métodos

Olá,

tenho um método de uma classe que extende da classe x: public int atualizarSolicitacao(Solicitacao solicitacao) throws Exception {

e o método: public void atualizarSolicitacao(Solicitacao sol) que está na classe x.

Eles tem o mesmo nome, mas retornam tipos diferentes.

O netbeans está reclamando, dizendo que não pode fazer override - pois os tipos são diferentes (can’t override return type is not compatible) - mas o objetivo não é fazer overread.

Alguém pode me indicar um meio de resolver o problema?

[quote=option]Olá,

tenho um método de uma classe que extende da classe x: public int atualizarSolicitacao(Solicitacao solicitacao) throws Exception {

e o método: public void atualizarSolicitacao(Solicitacao sol) que está na classe x.

Eles tem o mesmo nome, mas retornam tipos diferentes.

O netbeans está reclamando, dizendo que não pode fazer override - pois os tipos são diferentes (can’t override return type is not compatible) - mas o objetivo não é fazer overread.

Alguém pode me indicar um meio de como fazer isso?

Eu, na minha simples ignorancia, achava que isso era feito automaticamente, já que os tipos de retorno são diferentes, tornando as assinaturas dos métodos diferentes também =/

[/quote]
Isso que vc está fazendo não é possível. Se quiser fazer o override(uso do polimorfismo) com retornos diferentes, procure por retornos covariantes.

Obrigada, el_loko.

Depois que postei aqui, vi que a minha dúvida estava incoerente e mudei a pergunta.

Vou pesquisar sobre retornos covariantes, mas aproveitando da boa vontade, retorno covariante é compatível com java 1.4 ?

Bom… pesquisando sobre retornos covariantes, descobri que ele só funciona a partir do java 5: http://www.oficinadanet.com.br/artigo/java/java_polimorfismo_e_retorno_covariant

Alguém sabe como resolver o meu problema, usando java 1.4???

Veja se isso pode te ajudar!

http://javafree.uol.com.br/topic-856460-Polimorfismo-x-override-x-overload.html

Esse foi o primeiro link que achei quando comecei a pesquisar sobre uma forma para correção do problema :smiley: :wink:

Como int não é uma subclasse de void, (ou seja, int não estende void) então você não pode sobrepôr o método atualizarSolicitacao mudando o tipo de retorno dele de void para int.

Isso seria possível se você tivesse algo como:

classe X - public Object atualizarSolicitacao(Solicitacao sol)

classe que estende a X - public Integer atualizarSolicitacao(Solicitacao sol)

porque Integer é uma subclasse de Object (ou seja, Integer estende Object).

O tipo de retorno não faz parte da assinatura do método.

O que esse método faz, e o que é o int que ele retorna na classe filha?

Sabendo essas informações vai ficar mais fácil ajudar.

Obrigada, entanglement.

int é tipo primitivo, não estende de ninguem. Void estende de object e Integer de Number e Object.

Na classe pai, ele só tem que atualizar a solicitação mesmo.

Na classe filha, além da atualização, ele retorna o id da movimentação feita. Este valor será necessário para verificações em outros métodos que chamam estes métodos descritos.

A mensagem que o netbeans emite é:

[quote]atualizarSolicitacao(Solicitacao) in y cannot override atualizarSolicitacao(Solicitacao) in x
return type int is not compatible with void

Adicionar anotação @Override[/quote]

Uma forma rápida de resolver isso é fazer o método da classe pai ter retorno int e sempre retornar -1, ou algo assim.
Mas assim vc não vai ganhar nenhum prêmio de boas práticas…

De qualquer forma, é como eu faria =P

Marcos, obrigada pela dica =).

Acho que não custa nada tentar… 8) :oops:

Sei. De qualquer maneira, a mensagem “is not compatible” é uma forma de dizer que um método que retorna void não pode ser sobreposto por um que retorna int.

Há duas maneiras de resolver o seu problema:

a) Alterar a assinatura do método da classe pai para que também retorne int (ou Object, ou algum objeto de status), e
b) Criar mais um método na classe filha, que pode ser chamado pela classe que chama o método “atualizarSolicitacao”, que retorne só o tal id da modificação feita. Eu, em particular, acho isso um pouco frágil e desajeitado.