Ir ao conteúdo
  • Cadastre-se

Java Passar anotação como argumento


Posts recomendados

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.

Link para o comentário
Compartilhar em outros sites

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 {}

 

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

Em 17/05/2022 às 18:23, AdrianoSiqueira disse:

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.

Sim, mas acho que Person em si não é uma anotação e sim uma classe. Dá uma olhada nisso, vê se ajuda:

https://www.javatpoint.com/java-annotation

Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!