Kann jemand erklären, warum String- und Class-Annotation-Parameter unterschiedlich erwartet werden? Warum benötigt der Compiler Literale für Klassen und akzeptiert auch Konstanten für Strings?
Arbeitsbeispiel mit Spring @RequestMapping:
%Vor%WTF Beispiel mit TestNG's @Test:
%Vor%Was natürlich funktioniert, ist @Test (expectedExceptions = RuntimeException.class). Aber warum? Der einzige Unterschied im Annotationsparameter, den ich sehe, ist der Typ: String vs Class. Warum in aller Welt würde der Java-Compiler auch die String-Konstante akzeptieren, aber nur Klassenliterale akzeptieren?
Die Java-Sprachspezifikation erlaubt keine Verwendung von Kompilierzeitkonstanten mit Parametern vom Typ Class
. Sie können nur Klassenliterale verwenden.
Die JLS enthält die folgenden Informationen zu geeigneten Parameterwerten für Anmerkungen:
Ein Elementtyp T entspricht genau dann einem Elementwert V , wenn eine der folgenden Bedingungen zutrifft:
- T ist ein Array-Typ E [] und entweder:
- V ist ein ElementValueArrayInitializer und jeder ElementValueInitializer (analog zu einem Variableninitialisierer in einem Arrayinitialisierer) in V ist angemessen mit E . Oder
- V ist ein ElementValue , der T entspricht.
- Der Typ von V ist zuweisungskompatibel ( §5.2 ) mit T und außerdem:
Es ist ein Fehler bei der Kompilierung, wenn der Elementtyp nicht dem ElementValue entspricht.
Ich kann jedoch nicht sagen, warum diese Einschränkung in der JLS ist.
Ich habe den "Annotation-Wert muss ein Klassenliteral sein" auf dem folgenden:
%Vor%Dies geschieht, während Sie einer von Oracles Tutorials auf Websockets folgen. Es stellt sich heraus, dass das Video nicht die 720p-Qualität hat und die Unschärfe die Klammern, die wie geschweifte Klammern aussehen, verbirgt. Der Fehler verschwindet also, wenn Klammern (Klammern) für geschweifte Klammern geändert werden.
%Vor%hth jeder, der in Zukunft über dasselbe stolpern kann.
Sieh dir das an:
%Vor%Die Klasse sollte eine Throwable sein, die der Compiler überprüfen kann. Also, versuche das:
%Vor%