2017-09-03 2 views
0

ich mit Annotations-Prozessor versucht, einige Methoden wie das erzeugen:Wie kann ich Anmerkungen verwenden, um einen parametrisierten Typ darzustellen?

void result(Consumer<Type> name){ 

} 

, als ich mit einer Anmerkung müssen einen Parameter darstellen.

@Retention(RetentionPolicy.SOURCE) 
public @interface Parameter { 

    String name(); 

    Class<?> type(); 
} 

Aber die Annotation Mitglieder nur Unterstützung Kompilierung-Konstanten, so dass es eine parametrisierte Typ Lieferung direkt nicht möglich ist, zum Beispiel des folgenden illegal Java-Code kann nicht durch Annotation darstellen werden.

@Parameter(name ="ids",type = ArrayList<Integer>.class) 

Ich habe versucht, eine neue Anmerkung zu erklären, den Typ zu repräsentieren, weil die allgemeinen Parameter ein oder mehr sein kann und verschachtelt, wie ArrayList <HashMap <String, String >>, aber Java unterstützt keine Anmerkungen auf sich selbst verweisen, wird es zyklische Anmerkung verursachen Elementtyp Fehler. Die folgende Anmerkung ist ebenfalls unzulässig.

public @interface Type{ 
    Class<?> type(); 
    Type[] parameters() default {}; 
} 

@Retention(RetentionPolicy.SOURCE) 
public @interface Parameter { 

    String name(); 

    Type type(); 
} 

Irgendwelche Lösungen?

+0

Was möchten Sie mit dieser Anmerkung modellieren? –

+0

@SotiriosDelimanolis ich mit Annotations-Prozessor versucht, einige Methoden wie das erzeugen: 'Leere Ergebnis (Consumer Name)' – DouO

+1

Ja, beschreiben, dass die Verwendung Fall näher. Es ist nicht sofort offensichtlich, warum Sie es genau so brauchen. Siehe [Was das XY-Problem ist?] (Https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

Antwort

0

Wenn Sie einen Wert als Anmerkung Argument nicht darstellen kann, ist die Standardlösung anstelle einer Zeichenfolge zu verwenden. Verwenden Sie beispielsweise anstelle von @Parameter(..., type = ArrayList<Integer>.class)@Parameter(..., type = "ArrayList<Integer>"), die beliebig verschachtelte parametrisierte Typen darstellen können.

Ihr Code, der die Anmerkungen verwendet Parsing und Validierung des String-Argument tun müssen.

Verwandte Themen