Pergunta

Se um método que implementa um método de interface ser anotado com @Override?

O javadoc da Override anotação diz:

Indica que uma declaração de método se destina a substituir a declaração de método em uma superclasse. Se um método é anotado com este tipo de anotação, mas não substituir um método de superclasse, compiladores são necessários para gerar uma mensagem de erro.

Eu não acho que uma interface é tecnicamente uma superclasse. Ou é?

Pergunta Elaboração

Foi útil?

Solução

Você deve usar @Override sempre que possível. Ela impede que erros simples de ser feita. Exemplo:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

Esta não compila porque não corretamente substituir public boolean equals(Object obj) .

O mesmo irá por métodos que implementam uma interface ( 1,6 e acima só ) ou substituir um método de classe Super.

Outras dicas

Eu acredito que o comportamento javac mudou - com 1,5 proibiu a anotação, com 1,6 não. A anotação fornece uma verificação em tempo de compilação extra, por isso, se você estiver usando 1.6 Eu iria para ele.

Você deve métodos sempre anotar com @Override se ele está disponível.

No JDK 5 este meio métodos de superclasses primordiais, em JDK 6, e 7, isto significa substituir os métodos de superclasses, e métodos de interfaces de execução. A razão, como mencionado anteriormente, é que permite que o compilador a erros de captura quando você acha que você está substituindo (ou execução) um método, mas estão realmente definindo um novo método (assinatura diferente).

O exemplo equals(Object) vs equals(YourObject) é um processo padrão no ponto, mas o mesmo argumento pode ser feito para implementações de interface.

Eu imagino que a razão não é obrigatório para anotar métodos de interfaces de implementação é que o JDK 5 assinalaram este como um erro de compilação. Se JDK 6 fez esta anotação obrigatória, ele iria quebrar compatibilidade com versões anteriores.

Eu não sou um usuário Eclipse, mas em outros IDEs (IntelliJ), a anotação @Override só é adicionado ao implementar métodos de interface, se o projeto é definido como um projeto de um JDK 6 +. Imagino que Eclipse é semelhante.

No entanto, eu teria preferido ver um anotação diferente para este uso, talvez uma anotação @Implements.

Eu iria usá-lo em todas as oportunidades. Consulte Quando você usa anotação @Override de Java e por quê?

JDK 5.0 não permite que você use a anotação @Override se você estiver implementando método declarado na interface de (seu erro de compilação), mas JDK 6.0 permite. Então, pode ser que você pode configurar suas preferências projeto de acordo com sua exigência.

Substituir seus próprios métodos herdados de suas próprias classes normalmente não vai quebrar em refatorações usando um IDE. Mas se você substituir um método herdado de uma biblioteca é recomendável usá-lo. Se você não, muitas vezes você vai ter nenhum erro em uma mudança mais tarde biblioteca, mas um bug bem escondido.

Não é um problema com o JDK. Em Eclipse Helios, permite a anotação @Override para métodos de interface implementadas, conforme o JDK 5 ou 6. Como para Eclipse Galileo, a anotação @Override não é permitido, qualquer que seja o JDK 5 ou 6.

Se a concreto classe não é primordial um método abstrato, utilizando @Override para aplicação é uma questão em aberto uma vez que o compilador irá invariavelmente avisá-lo de quaisquer métodos unimplemented. Nestes casos, um argumento pode ser feito que ele retira a legibilidade - é mais coisas para ler no seu código e, em menor grau, é chamado @Override e não @Implement

.

Para mim, muitas vezes esta é a única razão pela qual alguns códigos requer Java 6 para compilar. Não tenho certeza se vale a pena.

si Eclipse irá adicionar a anotação @Override quando você diga a ele para "gerar métodos não implementadas" durante a criação de uma classe que implementa uma interface.

O problema com incluindo o @Override é que faz você pensar que você esqueceu de chamar o método super.theOverridenMethod(), que é muito confuso . Este deve ser cristalino. Talvez Java deve oferecer um @Interface para ser usado aqui. Oh bem, ainda um outro assed metade peculiaridade Java ...

Em java 6 e versões posteriores, você pode usar @Override para um método de implementação de uma interface.

Mas, eu donot acho que faz sentido: os meios de substituição que você hava um método na classe super, e você está implementando-o na classe sub.

Se você estiver implementando uma interface, eu acho que devemos usar @Implement ou outra coisa, mas não o @Override.

Ao ler o javadoc em java8, você pode encontrar o seguinte na declaração de Override de interface:

Se um método é anotado com essa anotação compiladores tipo são necessárias para gerar uma mensagem de erro a menos que pelo menos uma das seguintes condições são:

  • O método faz override ou implementar um método declarado em um supertipo.
  • O método tem uma assinatura que é override-equivalente ao de qualquer método públicas constante {@linkplain Object}.

Assim, pelo menos em java8, você deve usar @Override em uma implementação de um método de interface.

Para a interface, usando @Override causou erro de compilação. Então, eu tive que removê-lo.

Mensagem de erro foi "The method getAllProducts() of type InMemoryProductRepository must override a superclass method".

Ele também ler "One quick fix available: Remove @Override annotation."

Foi no Eclipse 4.6.3, JDK 1.8.0_144.

Se a classe que está a implementar o interface é uma classe abstract, @Override é útil para garantir que a implementação é para um método interface; sem a @Override uma classe abstract seria apenas compilar bem mesmo se a assinatura método de implementação não corresponde ao método declarado na interface; o método interface incompatíveis permaneceria como unimplemented. O doc Java citado por @Zhao

O método faz override ou implementar um método declarado em um supertipo

está claramente se referindo a uma classe abstract Super; um interface não pode ser chamado o supertipo. Então, @Override é redundante e não sensata para implementações de métodos interface em classes concretas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top