Dzisiaj chciałem utworzyć swój pierwszy interfejs adnotacji zgodnie z tą dokumentacją i dostałem ten błąd kompilatora
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
Oczywiście Object
nie można go użyć jako typu elementu adnotacji. Niestety nie mogłem znaleźć żadnych informacji na temat tego, które typy można ogólnie zastosować.
Przekonałem się o tym metodą prób i błędów:
String
→ Ważneint
→ WażneInteger
→ Nieprawidłowy (zaskakująco)String[]
→ Ważne (zaskakująco)Object
→ Nieprawidłowy
Być może ktoś może rzucić nieco światła na to, które typy są dozwolone i dlaczego.
java
annotations
Daniel Rikowski
źródło
źródło
Odpowiedzi:
Jest to określone w sekcji 9.6.1 JLS . Typy elementów adnotacji muszą być jednym z:
Wydaje się to restrykcyjne, ale bez wątpienia istnieją ku temu powody.
Należy również pamiętać, że tablice wielowymiarowe (np.
String[][]
) Są domyślnie zakazane przez powyższą zasadę.Tablice klasy nie są dozwolone, jak opisano w tej odpowiedzi .
źródło
Zgadzam się z Skaffmanem na dostępne typy.
Dodatkowe ograniczenie: musi to być stała czasowa kompilacji .
Na przykład zabronione są:
źródło
Nie zapominaj również, że same adnotacje mogą być częścią definicji adnotacji . Umożliwia to proste zagnieżdżanie adnotacji - przydatne w przypadkach, w których chciałbyś mieć jedną adnotację wiele razy.
Na przykład:
gdzie
SimpleAnnotation
jesti
ComplexAnnotation
jestPrzykłady zaczerpnięte z: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations
(oryginalny adres URL: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )
źródło
@Repeatable
nie jest to już potrzebne.Pojęcie adnotacji bardzo dobrze pasuje do projektu mojego projektu, dopóki nie zdałem sobie sprawy, że w adnotacji nie można mieć złożonych typów danych. Obejrzałem to, używając klasy tego, co chciałem utworzyć, a nie obiektu tej klasy. To nie jest idealne, ale java rzadko.
źródło