Ir ao conteúdo

Posts recomendados

Postado

E aí pessoal, beleza?

 

Estou fazendo alguns testes com anotações personalizadas e estou com uma dúvida sobre se é possível usar polimorfismo para passá-las como argumento. Desenvolvi o seguinte código, mas recebo um erro de compilação na parte onde tento usar polimorfismo. Segue o código:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class Main {

    public static void main(String[] args) {
        Person person = new Person();

        requiresAnnotation(person);    // Required: MyAnnotation    Provided: Person
        requiresInterface(person);     // Works just fine
    }

    private static void requiresAnnotation(MyAnnotation annotation) {}

    private static void requiresInterface(MyInterface _interface) {}


    @Retention(value = RetentionPolicy.RUNTIME)
    @Target(value = ElementType.TYPE)
    private @interface MyAnnotation {}

    private interface MyInterface {}


    @MyAnnotation
    private static class Person implements MyInterface {}
}

 

Não entendi o porquê de não ter funcionado, se alguém puder esclarecer ficarei grato.

Postado
17 horas atrás, AdrianoSiqueira disse:

E aí pessoal, beleza?

 

Estou fazendo alguns testes com anotações personalizadas e estou com uma dúvida sobre se é possível usar polimorfismo para passá-las como argumento. Desenvolvi o seguinte código, mas recebo um erro de compilação na parte onde tento usar polimorfismo. Segue o código:

Não entendi o porquê de não ter funcionado, se alguém puder esclarecer ficarei grato.


Está dando um erro nessa parte:

requiresAnnotation(person);

"incompatible types: person cannot be converted to MyAnnotation"

Isso daqui faz sentido pois está implementando MyInterface e não o MyAnnotation:

private static class Person implements MyInterface {}


Portanto esse daqui dá certo, porque person está implementando o MyInterface, que é justamente o parametro do requiresInterface:
 

requiresInterface(person);


aqui ta diferente, um está com arroba e o outro não, pode ser isso..:
 

private @interface MyAnnotation {}

private interface MyInterface {}

 

Postado
4 horas atrás, Felipecfk disse:

aqui ta diferente, um está com arroba e o outro não, pode ser isso..:

Essa é a sintaxe para a criação de anotações, é assim que o Java diferencia anotações de interfaces.

 

4 horas atrás, Felipecfk disse:

Portanto esse daqui dá certo, porque person está implementando o MyInterface, que é justamente o parametro do requiresInterface:

Exatamente, isso é o polimorfismo do Java.

 

O que eu queria saber é o porquê do Java não permitir a mesma lógica quando assunto é anotações, afinal Person usa a anotação MyAnnotation.

Postado
16 horas atrás, Felipecfk disse:

Sim, mas acho que Person em si não é uma anotação e sim uma classe.

Bem, seguindo essa lógica, Person também não é uma interface, logo não deveria funcionar também.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!